数据存储容器
1. 数据容器
一种可以容纳多份数据的数据类型(容器),容纳的每一份元素数据称之为1个元素,每一个元素都可以是任意类型的数据,如:字符串、数字、布尔等。
列表(list)
字符串(str)
元组(tuple)
集合(set)
字典(dict)
2. 列表
2.1列表介绍
列表是数据容器中的一类,是一次性可以存储多个数据元素的。
定义:列表名称 = [元素1, 元素2,元素3.............]
特点:
1.可以存储不同类型的元素
2.元素有序、可以重复、元素可以修改

#定义列表 - list
s = [1, 10, 145, 123, 123, "goog", "abc", True]
print(type(s))
#访问列表元素
print(s[0])
print(s[-8])
#修改列表元素
s[4] = "gys"
print(s[4])
#删除列表元素 del
del s[5]
print(s)
#遍历列表
for i in s:
print(i)
运行结果

2.2列表-切片
切片是指对操作的数据截取其中一部分的操作。列表、字符串、元组都支持切片操作。

语法:序列数据[开始索引:结束索引:步长]
1.不包含结束索引位置对应的元素(开始索引未指定默认为0;结束索引未指定默认为列表长度;步长未指定默认为1)
2.索引采用正向、反向索引都可以
3.步长是选取间隔,默认步长为1
s = ["a", "b", "c", "d", "e", "f", "g", "h", "j"]
#切片操作 s[开始索引:结束索引:步长]
print(s[0:5:1])
print(type(s[0:5:1]))
print(s[0:5]) #步长不写默认为1
print(s[:5]) #开始不写默认从0开始
print(s[0:5:2])
运行结果

2.3 list常用方法
列表的常用方法就是指列表这种数据类型内置的常见功能(添加元素、删除元素、排序等)
2.3.1增加元素 (Add)
|
方法名 |
功能说明 |
语法示例 |
执行后列表变化 |
|
|
追加: 在列表的最末尾添加一个元素。(最常用) |
|
|
|
|
插入: 在指定的索引位置插入一个元素。 |
|
|
|
|
扩展: 将另一个列表(或任何可迭代对象)里的所有元素逐一拼接到原列表末尾。 |
|
|
2.3.2删除元素 (Remove)
|
方法名 |
功能说明 |
语法示例 |
执行后列表变化 |
|
|
按值删除: 删除列表中第一个匹配该值的元素。如果值不存在会报错。 |
|
|
|
|
按位置删除(弹出): 删除并返回指定索引位置的元素。如果不写索引,默认删除并返回最后一个元素。 |
|
|
|
|
清空: 删除列表中的所有元素,把它变成空列表。 |
|
|
2.3.3查询与统计 (Find & Count)
|
方法名 |
功能说明 |
语法示例 |
返回结果 |
|
|
查找索引: 找某个值在列表中第一次出现的索引位置。找不到会报错。 |
|
返回数字 |
|
|
统计次数: 统计某个值在列表中一共出现了多少次。 |
|
返回该元素出现的次数 |
2.3.4排序与反转 (Sort & Reverse)
|
方法名 |
功能说明 |
语法示例 |
执行后列表变化 |
|
|
排序: 对原列表里的元素按从小到大排序。加上 参数则为从大到小。 |
|
|
|
|
反转: 把原列表的首尾顺序直接倒过来,不关心大小。 |
|
|
#将用户输入的10个数字,存储到一个列表中,并将列表中的数字进行排序,输出其中的最小值和最大值以及平均值
# 1.定义列表
num_list = []
# 2.将用户输入的10个数字存到列表
for i in range(10):
num = int(input("请输入一个有效数字:"))
num_list.append(num)
print("数字列表:", num_list)
# 3.排序
num_list.sort()
print("排序后的数字列表:", num_list)
# 4.输出最小值、最大值和平均值 sum():求和; len():获取列表长度
print("最小值为:", num_list[0])
print("最大值为:", num_list[-1])
print("平均值为:", sum(num_list) / len(num_list))

# 合并两个列表中的元素,并对合并后列表元素进行去重处理,并进行排序
num_list1 = [41, 0, 9, 28, 19, 99, 0, 32, 0, 18, 19]
num_list2 = [18, 8, 39, 38, 9, 32]
# 1.合并列表
# 方法1
# for num in num_list2:
# num_list1.append(num)
# 方法2
#组包:将多个值合并到一个容器
#num_list = [*num_list1, *num_list2] #解包:将列表这一类容器解开成一个一个独立的元素
# 方法3
num_list = num_list1 + num_list2
print("合并后的列表为:", num_list)
# 2.去重处理
new_list = []
for num in num_list:
if num not in new_list:
new_list.append(num)
print("去重后列表为:", new_list)

- 如何快速合并两个列表?
使用+运算符直接合并
使用*进行解包操作
- 如何判断一个元素是否在于列表之中
可用in运算符,语法为:元素 in 列表
2.3.5列表推导式
列表推导式就是按照一定的规则快速生成一个列表的方法
语法格式1:[要添加的值 for i in 序列/列表]
语法格式2:[要添加的值 for i in 序列/列表 if 条件]
# 生成1~20的平方列表。---> range(1,21)
#方式一: 传统方式
num_list = []
for i in range(1,21):
num_list.append(i**2)
print(num_list)
#方式二:列表推导式--->按照一定的规则快速生成一个列表的方法---> 语法格式:[要添加的值 for i in 序列/列表]
num_list2 = [i**2 for i in range(1,21)]
print(num_list2)
# 从生成的1~20平方列表中提取所有偶数,并再次计算其平方
num_list3 = [i**2 for i in num_list2 if i % 2 == 0]
print(num_list3)

、
3. 字符串Str
3.1字符串介绍
字符串是字符的容器,一个字符串中可以存放任意数量的字符。如“python” """python"""
特点:不可变性(无法修改)、有序性
字符串中的每一个字符串元素都有其对应的下标(索引),通过元素对应的索引,就可以获取到对应的元素。

注意:正向索引:下标从0开始;反向索引:下标从-1开始。
3.2字符串-切片
介绍:切片是指对对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作

语法:序列对象[开始索引:结束索引:步长]
注意:开始索引未指定默认为0;结束索引未指定默认为-1;步长未指定默认为1
# #字符串:不可修改,有序性、可迭代性
# s = "今天是星期六,我在学python!"
# print(s)
# print(s[6])
# #切片
# print(s[:6:])
# #步长: 正数从前往后截取; 负数从后往前截取
# print(s[:10:])
# print(s[::-1]) #可以用来字符串反转

3.3 str常用方法
3.3.1 格式化与清理 (Format & Clean)
用来对付那些不规范的文本(比如用户手滑多打的空格,或者大小写乱七八糟的拼音)。
|
方法名 |
功能说明 |
语法示例 |
返回结果 |
|
|
去除两端空白: 删掉字符串开头和结尾的空格、换行符( )和制表符( )。(爬虫和数据清洗最常用) |
|
|
|
|
全大写: 将所有小写字母转为大写。 |
|
|
|
|
全小写: 将所有大写字母转为小写。(常用于忽略大小写的比对) |
|
|
|
|
标题化: 将每个单词的首字母变成大写。 |
|
|
3.3.2 查找与替换 (Search & Replace)
用来在一段长文本中寻找特定内容,或者进行“文本替换”。
|
方法名 |
功能说明 |
语法示例 |
返回结果 |
|
|
查找位置: 找某个字符第一次出现的索引位置。如果找不到,会返回 (不会报错)。 |
|
|
|
|
统计次数: 统计某个子字符串在文本中一共出现了几次。 |
|
|
|
|
替换内容: 把字符串里的“旧内容”全替换成“新内容”。 |
|
|
3.3.3 拆分与拼接 (Split & Join) —— ⭐ 超级重要
字符串和列表(List)互相转换的桥梁,在实际开发中极其常用。
|
方法名 |
功能说明 |
语法示例 |
返回结果 |
|
|
切片/拆分: 按照指定的符号,把一个长字符串切成好几块,返回一个列表。默认按空格切。 |
|
|
|
|
拼接: (语法比较反直觉)把一个列表里的所有字符串,用指定的符号连接成一个新的长字符串。 |
|
|
3.3.4 条件判断 (Check)
用来做检查,返回的结果永远是布尔值(True 或 False)。
|
方法名 |
功能说明 |
语法示例 |
返回结果 |
|
|
是否以...开头: 常用来检查网址是否合法,或文件格式。 |
|
|
|
|
是否以...结尾: 常用来检查文件后缀。 |
|
|
|
|
是否全是纯数字: 检查字符串是不是全由数字组成。 |
|
|
|
|
是否全是纯字母: 检查字符串是不是全由字母组成(中文也算字母类)。 |
|
|
# 案列:处理用户不规范的输入
raw_input = input("请输入您的邮箱:")
# 1.先检验邮箱是否合法(包含1个'@'和至少1个'.')
if raw_input.count("@") == 1 and '.' in raw_input:
print("邮箱有效:",raw_input)
# 2. 去掉两边多余的空格和换行
clean_text = raw_input.strip()
print(f"去除多余空格后的邮箱:{clean_text}")
# 3.邮箱统一转换为小写
email = clean_text.lower()
print(f"最终邮箱:{email}")
else:
print("有效无效")

4. 元组tuple
元组和列表最大的不同点在于:元组一旦定义完成,不可修改
4.1 元组介绍
元组是不可变的序列,类似于列表,但创建后不可修改。
特点:
1.可以存储不同类型的元素
2.元素可以重复、有序、不可修改(支持索引、切片)
#定义元组
元组名称 = (元素1, 元素2......)
#定义空元组
元组名称 = ()
元组名称 = tuple()
4.2 tuple常用方法
|
方法名 |
功能说明 |
语法示例 |
返回结果 |
|
|
查找位置: 从左到右寻找某个值,返回它第一次出现的索引位置。找不到会报错。 |
|
|
|
|
统计次数: 统计某个特定值在元组中一共出现了多少次。 |
|
|
#定义元组
t1 = (1, 4, 5, 2, 6, 6, 2, 5)
print(t1)
print(type(t1))
#索引访问
print(t1[2])
print(t1[-3])
#切片
print(t1[:3:])
#count() 统计元素个数
print(t1.count(5))
#index() 获取元素的索引(第一个元素的位置)
print(t1.index(5))

4.3 tuple组包和解包
组包(packing):将多个值合并到一个容器(元组、列表)中。
解包(unpacking):将容器(元组、列表)解开独立的元素,分别赋值给多个变量。
#组包
t1 = (1, 2, 3, 4, 5, 6, 7, 8)
t2 = 1, 2, 3, 4, 5, 6
#解包
a, b, c, d, e, f, g, h = t1
print(a, b, c, d, e, f, g, h)
#扩展解包 (*收集剩余的所有元素,封装列表list中)
first, second, *other, last = t2
print(first, second, other, last)

# 计算每个学生的总分、各科平均分,然后一并输出
print("学号\t 姓名\t 语文\t 数学\t 英语\t 总分\t 平均分")
for s in student: #s: ("s001", "小明", 82, 98, 78)
total = s[2] + s[3] + s[4]
avg = total / 3
print(f"{s[0]}\t {s[1]}\t {s[2]}\t {s[2]}\t {s[3]}\t {total}\t {avg:.1f}")
# 2.统计各科成绩的最低分、最高分、平均分并输出
#2.1 获取各科的成绩列表
chinese_score = [s[2] for s in student]
math_score = [s[3] for s in student]
english_score = [s[4] for s in student]
print()
#2.2统计各科成绩的最低分、最高分、平均分
print(f"语文最低分:{min(chinese_score)}\t 最高分:{max(chinese_score)}\t 平均分:{sum(chinese_score) / len(chinese_score)}")
print(f"数学最低分:{min(math_score)}\t 最高分:{max(math_score)}\t 平均分:{sum(math_score) / len(math_score)}")
print(f"英语最低分:{min(english_score)}\t 最高分:{max(english_score)}\t 平均分:{sum(english_score) / len(english_score)}")
print()
print("优秀学生")
# 3.查找成绩优秀(平均分大于90的学生)
for s in student:
total = s[2] + s[3] + s[4]
avg = total / 3
if avg > 90:
print(f"学号:{s[0]}\t 姓名:{s[1]}\t 平均分:{avg:.1f}")

5. 集合set
5.1集合介绍
介绍:集合是一种无序的、不可重复的、可修改的数据容器。
定义:
#定义
s1 = {"A", "B", "C", "D", "E", "F"}
#定义空集合
S2 = set()
注意:空集合的定义不可以使用{},{}表示的是空字典;由于集合是无序的,因此不支持下标索引访问。


5.2 set常用方法
5.2.1元素的增删与清空 (基础操作)
|
方法名 |
功能详细说明 |
代码示例 |
结果变化 |
|
|
增加单个元素: 如果元素已存在,则忽略。 |
|
|
|
|
批量增加: 把列表、元组、字符串或其他集合里的元素全部加进来,并自动去重。 |
|
|
|
|
严格删除: 删除指定元素。注意:如果元素不存在,会引发 KeyError 报错! |
|
|
|
|
安全删除: 删除指定元素。就算元素不存在,也不会报错。 |
|
没报错,还是 |
|
|
随机弹出: 随机删除并返回一个元素。因为集合是无序的,所以你不知道它会弹哪个。若集合为空会报错。 |
|
删掉一个, 接收被删的值 |
|
|
清空: 清空集合里的所有元素,变成空集合 。 |
|
|
5.2.2集合的数学运算(生成“新”集合)
这是集合最强大的地方。有两种写法:操作符(更简洁)或 方法调用(兼容性更好,方法里可以传列表等其他容器,而操作符要求两边必须都是集合)。
(假设 A = {1, 2, 3}, B = {3, 4, 5})
|
运算类型 |
操作符写法 |
方法写法 |
逻辑含义 |
返回结果 |
|
交集 |
|
|
找共同点(都有的) |
|
|
并集 |
|
|
大融合去重(所有的) |
|
|
差集 |
|
|
我有你没有的(A里剔除B的元素) |
|
|
对称差集 |
|
|
非共同部分(独有元素的集合) |
|
5.2.3集合的高级数学运算
|
方法名 |
功能说明 |
代码示例与结果 |
|
|
原地保留交集: 把 A 变成它和 B 的交集。 |
结果 A 变成了 |
|
|
原地剔除: 直接从 A 里面删掉 B 中也存在的元素。 |
结果 A 变成了 |
|
|
原地保留对称差集: 把 A 变成双方不重合的部分。 |
同理,直接修改原集合 A |
5.2.4关系判断(返回 True / False)
写条件判断语句(if)时极其有用,用来侦测两个集合之间的关系。
(假设 S1 = {1, 2}, S2 = {1, 2, 3})
|
方法名 |
操作符 |
功能说明 |
语法示例 |
返回结果 |
|
|
|
是否是子集: 检查前者的所有元素是否都在后者里面。 |
|
|
|
|
|
是否是超集: 检查前者是否包含了后者的所有元素。 |
|
|
|
|
无 |
是否无交集: 检查两个集合是否完全没有共同元素。 |
|
|
football_set = {"王琳", "阿牛", "徐丽", "韩立", "唐三", "小舞", "厉飞雨", "紫灵", "妖啸天", "紫燕", "萧炎", "古帝", "霍雨浩"}
basketball_set = {"比比东", "唐昊", "奥斯卡", "贝贝", "韩立", "萧炎", "唐三", "霍雨浩", "李化元", "魂天帝", "古元", "徐三石"}
french_set = {"雅妃", "宁荣荣", "霍雨浩", "唐三", "萧炎", "彩麟", "唐舞桐", "韩立", "云韵", "李化元", "奥斯卡", "比比东"}
art_set = {"美杜莎", "霍雨浩", "姜楠", "菜头", "王冬", "唐三", "萧炎", "古熏儿", "小医仙", "云韵", "马小桃", "小舞"}
# 1.找出同时选修了法语和艺术的学生
fa_set = french_set.intersection(art_set)
print(f"同时选修法语和艺术的学生:{fa_set}")
# 2.找出同时选修了所有课程的同学
all_set = football_set & basketball_set & french_set & art_set
print(f"同时选修了所有课程的同学:{all_set}")
# 3.找出选修了足球,但是没有选修篮球的学生
ff_set = football_set.difference(basketball_set)
print(f"选修了足球,但是没有选修篮球的学生:{ff_set}")
# 4.统计每一个学生选修的课程数量
all_set = football_set | basketball_set | french_set | art_set
all_list = [*football_set, *basketball_set, *french_set, *art_set]
for s in all_list:
print(f"{s}选修了 {all_list.count(s)} 课程")

6. 字典dict
6.1 dict介绍
dict: 里面存储的是键值对(key: value)类型的数据,可以根据键(key)找到对应应的值(value)。
定义:
dict1 = {key: value, key: value, key: value, ...... }
#定义空字典
dict1 = {}
dict2 = dict()
特点:键值对(key: value)存储、键(key)不可重复、值可修改。
注意:字典中的value可以是任何类型的数据,而key不能为可变类型(如:列表list、集合set、字典dict)
dict1 = {"xiaoming":660, "xiaoshuai":720, "xiaopeng":680, "xiaomi":690}
print(dict1)
print(type(dict1))
#key必须是不可变类型:str\int\float\tuple; 不能是dict\set\list
dict2 = {0:660, 1.5:720, (1,2):680, "xiaomi":690}
print(dict2)
print(dict2[0])
dict2[0] = 730
print(dict2[0])
运行结果:

6.2 常用方法
6.2.1 核心基础:增、删、改、查
|
操作类型 |
语法示例 |
详细说明 |
结果 |
|
查 (精准查找) |
|
通过 Key 获取 Value。注意:如果 Key 不存在,会直接报错 (KeyError)! |
返回对应的值 |
|
查 (安全查找) |
|
⭐ 极度推荐! 查找 Key 的值。如果找不到,默认返回 ,绝对不会报错。 |
返回值或 |
|
增 / 改 |
|
如果 这个键不存在,就是新增;如果已经存在,就是覆盖修改旧值。 |
字典中多了一项 |
|
删 (指定键) |
|
删除指定的键值对。如果键不存在会报错。 |
删掉 这一项 |
|
删 (弹出并返回) |
|
删除指定的键,并且把对应的值拿出来赋给变量。 |
等于被删的值 |
|
清空 |
|
清空字典里的所有内容。 |
变成 |
6.2.2 字典的“三驾马车”(视图方法)
当需要用 for 循环遍历字典,或者想整体查看字典内容时,这三个方法是必不可少的。它们会返回类似列表的“视图对象”。
(假设字典 user = {"name": "Tom", "age": 20, "vip": True})
|
方法名 |
功能说明 |
语法示例 |
返回结果概要 |
|
|
拿走所有的“锁”: 返回字典里所有的键(Key)。 |
|
|
|
|
拿走所有的“宝物”: 返回字典里所有的值(Value)。 |
|
|
|
|
连锁带宝物全拿: 返回所有的键值对,每一个键值对打包成一个元组。 |
|
|
6.2.3 进阶实用方法
在处理复杂业务逻辑(比如合并配置、统计频率)时,这些方法能帮你省去写一堆 if-else 的麻烦。
|
方法名 |
功能说明 |
语法示例 |
|
|
批量更新/合并: 把另一个字典(或键值对序列)里的内容合并到当前字典中。如果有相同的键,新字典的值会覆盖旧值。 |
|
|
|
佛系赋值: 如果键存在,返回对应的值,什么都不做;如果键不存在,才增加这个键并赋给它一个默认值。 |
|
|
|
删除最后一项: 删除并返回字典中最后被加进去的那一个键值对(以元组形式返回)。 |
|
dict1 = {"xiaoming":660, "xiaoshuai":720, "xiaopeng":680, "xiaomi":690}
#增加
dict1["xiaohua"] = 700
print(dict1)
print(dict1["xiaohua"])
#修改
dict1["xiaohua"] = 725
print(dict1["xiaohua"])
#查找
value1 = dict1["xiaoming"]
value2 = dict1.get("xiaoming")
print(value1, value2)
print(dict1.keys()) #获取所有的key
print(dict1.values()) #获取字典里所有的值
print(dict1.items()) #获取所有的键值对 key:value
#删除
value3 = dict1.pop("xiaohua")
print(value3)
运行结果;

7. 数据容器总结与对比
|
特性 |
字符串 (str) |
列表 (list) |
元组 (tuple) |
集合 (set) |
字典 (dict) |
|
有序性 |
有序 |
有序 |
有序 |
无序 |
有序(3.7+) |
|
重复元素 |
允许 |
允许 |
允许 |
不允许 |
key不允许 |
|
可变性 |
不可变 |
可变 |
不可变 |
可变 |
可变 |
|
索引访问 |
支持 |
支持 |
支持 |
不支持 |
不支持 |
|
切片操作 |
支持 |
支持 |
支持 |
不支持 |
不支持 |
|
使用场景 |
文本处理 |
有序可重复数据集合 |
固定数据记录 |
去重数据集合 |
键值对 |
更多推荐

所有评论(0)