- 零基础学Python(第2版)
- 黄传禄 张克强 赵越
- 1138字
- 2025-03-22 17:26:58
4.3.4 字典的排序、复制
前面已经提到,列表的排序可以使用sorted()实现,字典的排序同样可以使用该函数。下面的代码演示了使用sorted()实现字典的排序。
01 #调用sorted()排序 02 dict = {"a" : "apple", "b" : "grape", "c" : "orange", "d" : "banana"}# 定义dict字典 03 print (dict) 04 #按照key排序 05 print (sorted(dict.items(), key=lambda d: d[0])) 06 #按照value排序 07 print (sorted(dict.items(), key=lambda d: d[1]))
【代码说明】
·第3行代码输出字典dict的结果如下。
{'a' : 'apple', 'b' : 'grape', 'c' : 'orange', 'd' : 'banana'}
·第5行代码把dict.items()作为需要排序的集合,items()前面已经提到,它可以用于字典的遍历,并返回(key,value)元组组成的列表。参数key表示排序的“依据”,d[0]表示items()中的key,即按照key值进行排序。lambda可以创建匿名函数,用于返回一些计算结果,lambda的使用请参考第5章的内容。排序后的结果:
[('a', 'apple'), ('b', 'grape'), ('c', 'orange'), ('d', 'banana')]
·第7行代码按照dict.items()中的value值进行排序。排序后的结果:
[('a', 'apple'), ('d', 'banana'), ('b', 'grape'), ('c', 'orange')]
前面提到了update(),这个方法把字典A的内容复制到字典B中,且字典B中原有的内容保持不变,从而实现了字典B的扩展。如果需要把字典A的内容复制到字典B,并清除字典B中原有的内容,可以使用copy()。copy()声明如下所示。
D.copy() -> a shallow copy of D
copy()实现了字典的浅拷贝操作,后面还会提到深拷贝的概念以及它们的区别,目前读者只需知道该方法的使用。下面这段代码演示了字典的复制操作。
01 #字典的浅拷贝 02 dict = {"a" : "apple", "b" : "grape"} # 定义dict字典 03 dict2 = {"c" : "orange", "d" : "banana"} # 定义dict2字典 04 dict2 = dict.copy() # 拷贝dict并赋给dict2 05 print (dict2)
【代码说明】第4行代码把字典dict的内容复制给dict2。字典dict2的输出结果:
{'a': 'apple', 'b': 'grape'}
深拷贝能够拷贝对象内部所有的数据和引用,引用相当于C语言中指针的概念,Python并不存在指针,但是变量的内存结构中通过引用来维护变量。而浅拷贝只是复制数据,并没有复制数据的引用,新的数据和旧的数据使用同一块内存空间。
例如,字典B浅拷贝字典A的数据,如果字典B的数据发生添加、删除或修改操作,字典A的数据也将发生变化;相反,如果字典B深拷贝字典A的数据,字典B的数据即使发生变化,也不会影响到字典A。
深拷贝和浅拷贝可以应用于Python的任何对象,不只是限于字典。在Python中可以使用copy模块来实现对象的深拷贝和浅拷贝,deepcopy()用于深拷贝操作,copy()用于浅拷贝操作。
下面【例4-8】中这段代码演示了浅拷贝和深拷贝的区别。
【例4-8.py】
01 #字典的深拷贝 02 import copy # 导入copy模块 03 dict = {"a" : "apple", "b" : {"g" : "grape","o" : "orange"}} # 定义字典dict 04 dict2 = copy.deepcopy(dict) # 深拷贝 05 dict3 = copy.copy(dict) # 浅拷贝 06 dict2["b"]["g"] = "orange" 07 print (dict) 08 dict3["b"]["g"] = "orange" 09 print (dict)
【代码说明】
·第2行代码导入了copy模块。在使用deepcopy()和copy()前,必须先导入copy模块。
·第4行代码字典dict2深拷贝字典dict。
·第5行代码字典dict3浅拷贝字典dict,copy.copy()的作用等价于dict.copy()。
·第6行代码没有改变字典dict2中的数据。
·第7行代码中字典dict并不会受字典dict2的影响,字典dict的数据保持不变。字典dict的输出结果:
{'a': 'apple', 'b': {'g': 'grape', 'o': 'orange'}}
·第8行代码改变了字典dict3中的数据。
·第9行代码中字典dict受字典dict3的数据改变的影响。字典dict的输出结果:
{'a': 'apple', 'b': {'g': 'orange', 'o': 'orange'}}