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'}}