Python的列表、元组、字典、集合的区别和特点
·
一、快速对比
| 特性 | 列表 (list) | 元组 (tuple) | 字典 (dict) | 集合 (set) |
|---|---|---|---|---|
| 定义符号 | [] |
() |
{key: value} |
{} 或 set() |
| 是否可变 | 可变 | 不可变 | 可变 | 可变 |
| 是否有序 | 有序 | 有序 | 有序(Python 3.7+) | 无序 |
| 元素可重复 | 是 | 是 | 键唯一,值可重复 | 否(自动去重) |
| 元素要求 | 任意对象 | 任意对象 | 键必须可哈希 | 元素必须可哈希 |
| 典型用途 | 动态序列,存储有顺序的数据 | 记录、坐标、函数多返回值 | 键值映射,快速查找 | 去重、关系测试、数学运算 |
| 内存占用 | 较高 | 较低 | 较高 | 中 |
二、各自特点与最常用方法
1. 列表 —— 最灵活的序列
特点:动态数组,支持索引、切片、解包;增删改查功能丰富;常用推导式快速生成。
常用方法(假设 lst = [2, 4, 6]):
# 增 lst.append(8) # 尾部追加 -> [2,4,6,8] lst.insert(1, 3) # 在索引1处插入3 -> [2,3,4,6,8] lst.extend([10, 12]) # 扩展多个元素 -> [2,3,4,6,8,10,12] # 删 lst.remove(6) # 删除第一个值为6的元素 lst.pop() # 删除并返回最后一个元素(也可指定索引) lst.clear() # 清空列表 # 查与排序 lst.index(4) # 返回4首次出现的索引 lst.count(2) # 统计2出现次数 lst.sort() # 原地升序排序 lst.sort(reverse=True) # 原地降序 new = sorted(lst) # 返回新列表,原列表不变 lst.reverse() # 原地反转 # 复制 b = lst.copy() # 浅拷贝 # 常用操作:len(lst), 成员判断 in, 切片 lst[1:3], 列表推导式 [x*2 for x in lst]
2. 元组 —— 不可变的“记录”
特点:一旦创建不能修改,因此更安全、可哈希;常用于坐标、数据库记录、函数返回多个值。
常用方法(仅两个):
t = (1, 2, 2, 3, 2) t.count(2) # 统计2的出现次数 -> 3 t.index(3) # 查找3第一次出现的索引 -> 3 # 支持:len(t), 索引 t[0], 切片 t[1:3], 解包 a, b, c = t # 注意:单元素元组须加逗号 (42,)
3. 字典 —— 键值对仓库
特点:以键(key)进行超快查找;键必须是不可变且可哈希的类型(如字符串、数字、元组)。3.7+ 版本保持插入顺序。
常用方法:
d = {'a': 1, 'b': 2}
# 增 / 改
d['c'] = 3 # 直接赋值,若键存在则修改
d.update({'b': 20, 'd': 4}) # 批量更新/添加
d.setdefault('e', 5) # 若键不存在则设为5,返回最终值
# 删
d.pop('a') # 删除键并返回值(可设默认值防报错)
d.popitem() # 删除并返回最后插入的键值对(3.7+)
d.clear()
# 查
d.get('x', 0) # 安全取值,不存在时返回0
d.keys() # 返回所有键的视图
d.values() # 返回所有值的视图
d.items() # 返回所有(键,值)对的视图
# 遍历 for k, v in d.items()
# 合并(Python 3.9+)
d1 | d2 # 返回合并后的新字典(后者覆盖前者键)
d1 |= d2 # 原地更新合并
4. 集合 —— 不重复元素的容器
特点:无序、不重复,自动去重;支持数学中的交集、并集、差集等操作,适合成员检测和去重。
常用方法:
s = {1, 2, 3}
# 增删(注意重复元素不会加入)
s.add(4) # 添加单个元素
s.remove(2) # 删除元素,若不存在会报错
s.discard(2) # 安全删除,不存在不报错
s.pop() # 随机删除并返回一个元素
s.clear()
# 集合运算(返回新集合)
a = {1, 2, 3}
b = {2, 3, 4}
a | b # 并集 {1,2,3,4}
a & b # 交集 {2,3}
a - b # 差集(只在a中) {1}
a ^ b # 对称差集(只在一边) {1,4}
# 原地更新(修改原集合)
a.update(b) # a = a | b
a.intersection_update(b) # a = a & b
a.difference_update(b) # a = a - b
a.symmetric_difference_update(b) # a = a ^ b
# 关系判断
a.issubset(b) # a是不是b的子集
a.issuperset(b) # a是不是b的超集
a.isdisjoint(b) # a和b是否没有交集更多推荐
所有评论(0)