前面咱们学了变量 —— 但一个变量只能装一个值。真实程序里数据是一堆一堆的:一筐学生的成绩、一本通讯录、一批订单…… 这时候就需要容器(Container)把数据装起来。
Python 有四种主力容器:列表 list、元组 tuple、字典 dict、集合 set。老哥这篇把它们一次讲透,重点讲清它们的区别 —— 搞懂这个,以后选型不再纠结。
一、先认识 "序列"
列表、元组、字符串都是序列(Sequence)—— 有序、能按下标访问。序列通用操作先记住:
seq[0] # 索引,从0开始,末尾从-1开始 seq[1:3] # 切片,含头不含尾 seq1 + seq2 # 相加 seq * 3 # 乘法(重复) x in seq # 成员检查 len(seq) # 长度 max(seq) min(seq) # 最大/最小二、列表 List(可变、有序、允许重复)
用[]定义,元素可以不同类型。它是你用最多的容器。
list1 = [100, 200, 300, 400, 500] print(list1[1]) # 200 print(list1[-2]) # 400 print(list1[2:4]) # [300, 400] 切片含头不含尾 print(list1[::-1]) # [500,400,300,200,100] 倒序增删改查:
list1.append(600) # 末尾追加 list1.insert(2, 700) # 指定位置插入 list1[0] = -1 # 按下标改 list1[2:4] = ["a","b","c"] # 按切片改 del list1[2] # 删除指定位置 100 in list1 # 成员检查 len(list1) # 长度 max(list1) min(list1) sum(list1) # 最大/最小/求和遍历三种姿势:
for i in list1: # 直接遍历元素 print(i) for i in range(len(list1)): # 按下标遍历 print(i, list1[i]) for i, val in enumerate(list1): # 同时拿下标和元素(最推荐) print(i, val)列表推导式(Python 精髓,一行生成新列表):
squares = [x**2 for x in range(5)] # [0,1,4,9,16] even_squares = [x**2 for x in range(10) if x % 2 == 0] # 带条件 [0,4,16,36,64] pairs = [(i, j) for i in [1,2] for j in ["a","b"]] # 双重循环zip()把多个列表对应元素打包成元组:
list1 = [1, 2, 3]; list2 = ["a", "b", "c"] print(list(zip(list1, list2))) # [(1,'a'),(2,'b'),(3,'c')]三、字符串 String(不可变、有序)
字符串也是序列,但不可变—— 里面的字符不能改。常用函数很实用:
str1 = "hello world" print("lo" in str1) # True print(str1.replace("world", "Python")) # 替换 print(str1.split()) # 按空白分割成列表 print("_".join(["a","b","c"])) # a_b_c join以x为连接符 print(str1.upper()) # HELLO WORLD print(str1.startswith("he")) # True print(str1.find("lo")) # 找到返回下标,找不到返回-1原始字符串:前面加r,转义字符失效,常用于路径和正则:
print("hello\nworld") # 换行 print(r"hello\nworld") # 原样输出 hello\nworld四、元组 Tuple(不可变、有序、允许重复)
用()定义,元素不能修改。适合装 "不该变" 的数据(如坐标、日期)。
tuple1 = (100, 200, 300) print(tuple1[2]) # 300 print(len(tuple1)) # 3两个易错点:
- 单元素元组要加逗号:
(100,),否则(100)只是括号运算; - 元组不可变是 "指向的内存内容不可变",但如果元组里嵌套了可变类型(如列表),嵌套项仍可改:
tuple1 = (100, [1, 2, 3]) tuple1[3].append(4) # 元组里的列表可以改五、集合 Set(可变、无序、不允许重复)
用{}或set()定义,自动去重、没有下标。最适合:去重、快速成员检查、集合运算。
set1 = {1, 2, 2, 3} # {1,2,3} 自动去重 set1.add(4) set1.remove(2) # 不存在会报错 set1.discard(99) # 不存在也不报错集合运算(这是集合的杀手锏):
a = {1, 2, 3}; b = {2, 3, 4} print(a & b) # 交集 {2,3} print(a | b) # 并集 {1,2,3,4} print(a - b) # 差集 {1} print(a ^ b) # 对称差(不重复的部分){1,4}⚠️ 注意:创建空集合要用set(),用{}会建出空字典!
六、字典 Dictionary(可变、无序、键唯一)
用{},格式{key: value}。键唯一、键必须不可变(字符串 / 数字 / 元组),值随便。
dict1 = {"name": "Alice", "age": 18} print(dict1["name"]) # Alice print(dict1.get("address")) # 键不存在返回 None(不报错) print(dict1.get("address", "earth")) # 指定默认值 dict1["name"] = "Bob" # 修改 dict1["address"] = "earth" # 新增 "name" in dict1 # 检查键是否存在 len(dict1) # 键值对个数遍历三种:
for k in dict1.keys(): # 遍历键 for v in dict1.values(): # 遍历值 for k, v in dict1.items(): # 同时遍历键值(最常用)字典推导式:
squares = {x: x**2 for x in range(4)} # {0:0, 1:1, 2:4, 3:9}七、一张表记住四种容器怎么选
表格
| 数据结构 | 可变 | 允许重复 | 有序 | 定义符号 |
|---|---|---|---|---|
| 列表 List | ✅ | ✅ | ✅ | []或list() |
| 元组 Tuple | ❌ | ✅ | ✅ | ()或tuple() |
| 字典 Dict | ✅ | 键不许 / 值许 | 键无序 (3.7 + 保持插入序) | {}或dict() |
| 集合 Set | ✅ | ❌ | ❌ | {}或set() |
老哥收尾
选型口诀送给你:
要改、要排序、要重复 → 用列表;不能改、求固定 → 用元组;要去重、要集合运算 → 用集合;要按名字查值 → 用字典。
下一篇咱们讲函数—— 把重复代码封装起来,是程序变 "模块化" 的第一步。有问题随时回来找老哥。