Python数据结构操作对比:字典、列表、元组、集合
以下是四种主要数据结构的操作对比,包含详细示例和注释:
1. 创建(初始化)
# ========== 字典 (dict) ==========# 创建空字典dict1={}dict2=dict()# 创建带初始值的字典dict3={'name':'Alice','age':25}dict4=dict(name='Bob',age=30)dict5=dict([('name','Charlie'),('age',35)])# ========== 列表 (list) ==========# 创建空列表list1=[]list2=list()# 创建带初始值的列表list3=[1,2,3,4,5]list4=list('hello')# ['h', 'e', 'l', 'l', 'o']list5=[iforiinrange(5)]# 列表推导式:[0, 1, 2, 3, 4]# ========== 元组 (tuple) ==========# 创建空元组tuple1=()tuple2=tuple()# 创建带初始值的元组tuple3=(1,2,3)tuple4=1,2,3# 括号可省略,逗号是关键tuple5=(1,)# 单个元素的元组需要加逗号tuple6=tuple([1,2,3])# 从列表转换# ========== 集合 (set) ==========# 创建空集合(不能使用{},因为这是空字典)set1=set()# 创建带初始值的集合set2={1,2,3,4,5}set3=set([1,2,2,3,3])# 去重后:{1, 2, 3}set4={iforiinrange(5)}# 集合推导式:{0, 1, 2, 3, 4}2. 增加元素
# ========== 字典 (dict) ==========dict1={'name':'Alice'}dict1['age']=25# 添加新键值对dict1.setdefault('city','Beijing')# 如果键不存在则添加,存在则返回原值dict1.update({'job':'Engineer','salary':50000})# 批量添加/更新# ========== 列表 (list) ==========list1=[1,2,3]list1.append(4)# 末尾添加单个元素:[1, 2, 3, 4]list1.extend([5,6])# 末尾添加多个元素:[1, 2, 3, 4, 5, 6]list1.insert(1,1.5)# 在索引1处插入1.5:[1, 1.5, 2, 3, 4, 5, 6]# ========== 元组 (tuple) ==========# 元组不可变,不能直接添加元素tuple1=(1,2,3)# 可以通过创建新元组实现"添加"tuple2=tuple1+(4,)# (1, 2, 3, 4)# ========== 集合 (set) ==========set1={1,2,3}set1.add(4)# 添加单个元素:{1, 2, 3, 4}set1.update([5,6,7])# 添加多个元素:{1, 2, 3, 4, 5, 6, 7}3. 修改元素
# ========== 字典 (dict) ==========dict1={'name':'Alice','age':25}dict1['age']=26# 修改现有键的值dict1.update({'age':27,'name':'Alicia'})# 批量修改# ========== 列表 (list) ==========list1=[1,2,3,4,5]list1[2]=30# 修改索引2处的值:[1, 2, 30, 4, 5]list1[1:4]=[20,30,40]# 修改切片:[1, 20, 30, 40, 5]# ========== 元组 (tuple) ==========# 元组不可变,不能修改元素tuple1=(1,2,3)# 如果元素本身是可变对象,可以修改其内容tuple2=([1,2],[3,4])tuple2[0].append(3)# 可以:([1, 2, 3], [3, 4])# ========== 集合 (set) ==========# 集合元素不可变且无序,不能直接修改特定元素# 通常先删除再添加set1={1,2,3}set1.remove(2)# 删除元素2set1.add(20)# 添加新元素20:{1, 3, 20}4. 查找元素
# ========== 字典 (dict) ==========dict1={'name':'Alice','age':25,'city':'Beijing'}value1=dict1['name']# 通过键获取值,键不存在会报错value2=dict1.get('age')# 通过键获取值,键不存在返回Nonevalue3=dict1.get('salary',0)# 键不存在返回默认值0has_key='city'indict1# 检查键是否存在:Truekeys=dict1.keys()# 获取所有键values=dict1.values()# 获取所有值items=dict1.items()# 获取所有键值对# ========== 列表 (list) ==========list1=[10,20,30,20,40,50]value=list1[2]# 通过索引获取元素:30index1=list1.index(20)# 查找元素首次出现的位置:1index2=list1.index(20,2)# 从索引2开始查找:3count_20=list1.count(20)# 统计元素出现次数:2has_value=30inlist1# 检查元素是否存在:True# ========== 元组 (tuple) ==========tuple1=(10,20,30,20,40)value=tuple1[2]# 通过索引获取元素:30index=tuple1.index(20)# 查找元素首次出现的位置:1count=tuple1.count(20)# 统计元素出现次数:2has_value=30intuple1# 检查元素是否存在:True# ========== 集合 (set) ==========set1={10,20,30,40,50}has_value=30inset1# 检查元素是否存在:True# 集合查找效率很高(O(1)),但只能检查存在性5. 删除元素
# ========== 字典 (dict) ==========dict1={'name':'Alice','age':25,'city':'Beijing','job':'Engineer'}deldict1['age']# 删除指定键值对value=dict1.pop('city')# 删除并返回指定键的值key_value=dict1.popitem()# 删除并返回最后一个键值对(Python 3.7+有序)dict1.clear()# 清空字典# ========== 列表 (list) ==========list1=[10,20,30,40,50,60,70]dellist1[2]# 删除索引2处的元素:[10, 20, 40, 50, 60, 70]value=list1.pop()# 删除并返回最后一个元素:70value2=list1.pop(1)# 删除并返回索引1处的元素:20list1.remove(40)# 删除首次出现的指定元素:[10, 50, 60]list1.clear()# 清空列表:[]# ========== 元组 (tuple) ==========# 元组不可变,不能删除单个元素tuple1=(1,2,3,4,5)# 只能通过切片或创建新元组实现"删除"tuple2=tuple1[:2]+tuple1[3:]# 删除索引2处的元素:(1, 2, 4, 5)# ========== 集合 (set) ==========set1={10,20,30,40,50,60}set1.remove(30)# 删除指定元素,不存在则报错set1.discard(40)# 删除指定元素,不存在不报错value=set1.pop()# 删除并返回任意一个元素set1.clear()# 清空集合:set()6. 高级操作
# ========== 字典 (dict) ==========dict1={'a':1,'b':2,'c':3}# 字典推导式dict2={k:v*2fork,vindict1.items()}# {'a': 2, 'b': 4, 'c': 6}# 合并字典dict3={'a':10,'d':4}merged={**dict1,**dict3}# {'a': 10, 'b': 2, 'c': 3, 'd': 4}(Python 3.5+)# 默认值字典fromcollectionsimportdefaultdict dd=defaultdict(int)# 不存在的键返回int(),即0dd['x']+=1# dd['x']现在为1# 有序字典fromcollectionsimportOrderedDict od=OrderedDict([('a',1),('b',2),('c',3)])# ========== 列表 (list) ==========list1=[3,1,4,1,5,9,2]# 排序(返回新列表)sorted_list=sorted(list1)# [1, 1, 2, 3, 4, 5, 9]# 原地排序list1.sort()# 列表变为[1, 1, 2, 3, 4, 5, 9]# 反转reversed_list=list(reversed(list1))# [9, 5, 4, 3, 2, 1, 1]list1.reverse()# 原地反转# 过滤filtered=[xforxinlist1ifx>3]# 列表推导式过滤:[9, 5, 4]# 映射mapped=[x*2forxinlist1]# [18, 10, 8, 6, 4, 2, 2]# ========== 元组 (tuple) ==========tuple1=(3,1,4,1,5)# 元组解包a,b,c,d,e=tuple1# a=3, b=1, c=4, d=1, e=5# 扩展解包first,*middle,last=tuple1# first=3, middle=[1, 4, 1], last=5# 命名元组fromcollectionsimportnamedtuple Point=namedtuple('Point',['x','y'])p=Point(10,20)# p.x=10, p.y=20# ========== 集合 (set) ==========set1={1,2,3,4,5}set2={4,5,6,7,8}# 集合运算union_set=set1|set2# 并集:{1, 2, 3, 4, 5, 6, 7, 8}intersection_set=set1&set2# 交集:{4, 5}difference_set=set1-set2# 差集:{1, 2, 3}symmetric_diff=set1^set2# 对称差集:{1, 2, 3, 6, 7, 8}# 子集/超集判断is_subset={1,2}.issubset(set1)# Trueis_superset=set1.issuperset({1,2})# True# 冻结集合(不可变集合)fs=frozenset([1,2,3,4])7. 性能与特性总结
""" 总结对比: 1. 字典 (dict): - 键值对存储,键必须可哈希 - 查找、插入、删除平均O(1)时间复杂度 - Python 3.7+保持插入顺序 2. 列表 (list): - 有序、可变、允许重复 - 索引访问O(1),插入/删除末尾O(1),中间O(n) - 适合顺序访问和修改 3. 元组 (tuple): - 有序、不可变、允许重复 - 性能比列表稍好(内存小,创建快) - 适合作为字典键(如果元素都可哈希) 4. 集合 (set): - 无序、可变、元素唯一、元素必须可哈希 - 查找、插入、删除平均O(1)时间复杂度 - 适合去重和集合运算 """8. 类型转换示例
# 列表转其他类型lst=[1,2,2,3,4]to_dict=dict(enumerate(lst))# {0: 1, 1: 2, 2: 2, 3: 3, 4: 4}to_tuple=tuple(lst)# (1, 2, 2, 3, 4)to_set=set(lst)# {1, 2, 3, 4}(去重)# 字典键/值转换d={'a':1,'b':2,'c':3}keys_list=list(d.keys())# ['a', 'b', 'c']values_tuple=tuple(d.values())# (1, 2, 3)# 集合转列表/元组s={1,2,3,4}set_to_list=list(s)# [1, 2, 3, 4]set_to_tuple=tuple(s)# (1, 2, 3, 4)每种数据结构都有其特定的用途和优势,根据具体需求选择合适的数据结构可以显著提高代码效率和可读性。