Python集合
ai时代python集合
集合set
s = {'a', 'b', 'c'}
# 增加 合并
s |= {'g', 'h'} # 并集更新
# 删除
s.remove('a') # 不存在会报错
s.discard('a') # 不存在不报错
s.pop() # 随机删除一个, s.pop('a') 不行, 不支持
s.clear() # 清空
# 查询
'a' in s # 成员检测, 所有集合都支持的操作, s.get('a') 不支持
s.issubset(other) # 子集检测
s.issuperset(other) # 超集检测
len(s) # 获取元素数量
bool(s) # 检查是否为空:True为非空,False为空
# 集合运算
s1 & s2 # 交集
s1 | s2 # 并集
s1 - s2 # 差集
s1 ^ s2 # 对称差集, 仅属于一个集合的元素, 并集-交集
操作 | list | tuple | dict | set |
---|---|---|---|---|
[index] | ✅ | ✅ | ✅(key) | ❌ |
.get() | ❌ | ❌ | ✅ | ❌ |
.pop() | ✅ | ❌ | ✅ | 不能带参数 |
in | ✅ | ✅ | ✅ | ✅ |
len() | ✅ | ✅ | ✅ | ✅ |
切片[:] | ✅ | ✅ | ❌ | ❌ |
字典dic
d = {'a': 1, 'b': 2, 'c': 3}
# 访问
d['a'] # 1 (不存在会KeyError)
d.get('a') # 1 (推荐,不存在返回None)
d.get('x', 'default') # 'default' (指定默认值)
'a' in d # True - 检查key是否存在
1 in d.values() # True - 检查value是否存在
d.keys() # dict_keys(['a', 'b', 'c'])
d.values() # dict_values([1, 2, 3])
d.items() # dict_items([('a', 1), ('b', 2), ('c', 3)])
len(d) # 3
bool(d) # True (空字典为False)
# 增加
d['b'] = 2 # 可能是个修改
# 合并字典
d3 = {**d1, **d2} # (Python 3.5+)
d3 = d1 | d2 # 同上, (Python 3.9+)
# 安全添加 (key不存在才添加)
d.setdefault('i', 9) # 返回9,d中添加 'i': 9
d.setdefault('a', 99) # 返回1,'a'已存在不会修改
# 删除
del d['a'] # 不存在会KeyError
d.pop('b') # 返回2,不存在会KeyError
d.pop('x', 'default') # 返回'default',安全删除
d.popitem() # 删除最后插入的项 (Python 3.7+), 返回 ('c', 3)
d.clear() # 清空 {}
# 复制
d_copy = d1.copy() # 浅拷贝
d_copy = dict(d1) # 另一种复制方式
# 创建字典的多种方式
dict1 = dict(a=1, b=2) # 关键字参数
dict2 = dict([('a', 1), ('b', 2)]) # 键值对列表
dict3 = dict(zip(['a', 'b'], [1, 2])) # zip组合
dict4 = {k: v for k, v in [('a', 1), ('b', 2)]} # 字典推导式
# 默认值字典
from collections import defaultdict
dd = defaultdict(list) # 访问不存在的key会自动创建空list
dd['key'].append(1) # 自动创建 dd['key'] = [],然后append
数组列表 (List) - 可变类型
增加 (Create/Add)
# 创建
arr = [1, 2, 3]
arr = [] # 空列表
# 合并
arr += [7, 8] # [1, 2, 3, 4, 5, 6, 7, 8]
# 解包合并
combined_list = [*list1, *list2]
# 指定位置插入
arr.insert(0, 0) # [0, 1, 2, 3, 4, 5, 6, 7, 8] (在索引0插入)
arr.insert(-1, 'x') # 在倒数第二个位置插入
删除 (Delete)
arr = [1, 2, 3, 2, 4]
# 按值删除
arr.remove(2) # [1, 3, 2, 4] (删除第一个2)
# 按索引删除
del arr[1] # [1, 2, 4] (删除索引1)
item = arr.pop() # 删除并返回最后一个元素
item = arr.pop(0) # 删除并返回索引0的元素
# 清空
arr.clear() # []
修改 (Update)
arr = [1, 2, 3, 4]
# 单个元素
arr[0] = 10 # [10, 2, 3, 4]
# 切片修改
arr[1:3] = [20, 30] # [10, 20, 30, 4]
arr[::2] = [100, 300] # [100, 20, 300, 4] (步长为2)
# 排序
arr.sort() # 原地排序
arr.reverse() # 原地反转
查询 (Read)
arr = [1, 2, 3, 2, 4]
# 访问
print(arr[0]) # 1 (第一个)
print(arr[-1]) # 4 (最后一个)
print(arr[1:3]) # [2, 3] (切片)
# 查找
index = arr.index(2) # 1 (第一个2的索引)
count = arr.count(2) # 2 (2的出现次数)
exists = 3 in arr # True (是否存在)
# 长度
length = len(arr) # 5
元组 (Tuple) - 不可变类型
创建 (Create)
# 创建
tup = (1, 2, 3)
tup = 1, 2, 3 # 括号可选
tup = (1,) # 单元素元组(注意逗号)
tup = () # 空元组
# 从其他类型转换
tup = tuple([1, 2, 3]) # 从列表
tup = tuple("abc") # ('a', 'b', 'c')
查询 (Read) - 与列表相同
tup = (1, 2, 3, 2, 4)
# 访问(同列表)
print(tup[0]) # 1
print(tup[-1]) # 4
print(tup[1:3]) # (2, 3)
# 查找(同列表)
index = tup.index(2) # 1
count = tup.count(2) # 2
exists = 3 in tup # True
length = len(tup) # 5
增加/修改/删除 - 不支持!
tup = (1, 2, 3)
# 这些操作都会报错
# tup[0] = 10 # TypeError
# tup.append(4) # AttributeError
# del tup[0] # TypeError
实用操作对比表
操作 | 列表 | 元组 | 说明 |
---|---|---|---|
创建 | [1,2,3] |
(1,2,3) |
元组括号可选 |
访问 | arr[0] |
tup[0] |
相同语法 |
切片 | arr[1:3] |
tup[1:3] |
相同语法 |
长度 | len(arr) |
len(tup) |
相同语法 |
包含 | x in arr |
x in tup |
相同语法 |
查找 | arr.index(x) |
tup.index(x) |
相同语法 |
计数 | arr.count(x) |
tup.count(x) |
相同语法 |
修改 | ✅ arr[0]=x |
❌ 不支持 | 元组不可变 |
添加 | ✅ arr.append(x) |
❌ 不支持 | 元组不可变 |
删除 | ✅ arr.remove(x) |
❌ 不支持 | 元组不可变 |
性能和使用建议
# 列表:数据会变化时使用
nodes = ['main', 'child1', 'child2']
nodes.append('child3') # 可以修改
# 元组:数据固定时使用(更快,更安全)
coordinates = (100, 200) # 坐标通常不变
rgb_color = (255, 0, 0) # 颜色值通常不变
# 函数返回多值时常用元组
def get_position():
return 100, 200 # 返回元组
x, y = get_position() # 解包