上QQ阅读APP看书,第一时间看更新
2.12.3 合并
dict的合并思路并不复杂,根据已经掌握的关于dict的知识,我们可以用遍历方式很容易地做到。我们更想了解的是,有没有办法能用一行代码完成dict的合并?
有,可以用dict对象的update方法。
>>> group1 = {'A': 1, 'C': 3} >>> group2 = {'B': 2} >>> >>> group1.update(group2) >>> >>> group1 {'A': 1, 'C': 3, 'B': 2} >>> group2 {'B': 2}
从结果可以看到,update方法会顺利合并两个dict。如果两个dict含有相同的key,则“源”字典中相应的值会被覆盖。
>>> group1 = {'A': 1, 'C': 3} >>> group2 = {'B': 2, 'C': 333} >>> >>> group1.update(group2) >>> group1 {'A': 1, 'C': 333, 'B': 2}
如果有多个dict需要合并,我们不能用链式表达来做到,因为update方法是“原地更新”,本身的返回值是None。
>>> group1 = {'A': 1, 'C': 3} >>> group2 = {'B': 2, 'C': 333} >>> group3 = {'B': 22, 'D': 4} >>> >>> group1.update(group2).update(group3) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'update'
我们可以多次调用update方法做到。
>>> group1 = {'A': 1, 'C': 3} >>> group2 = {'B': 2, 'C': 333} >>> group3 = {'B': 22, 'D': 4} >>> >>> group1.update(group2) >>> group1.update(group3) >>> group1 {'A': 1, 'C': 333, 'B': 22, 'D': 4}
如果需要合并的dict很多,我们可以用循环来简化代码。
group1 = {'A': 1, 'C': 3} group2 = {'B': 2, 'C': 333} group3 = {'B': 22, 'D': 4} groups_to_merge = [group2, group3] for group in groups_to_merge: group1.update(group) print(group1)
执行结果如下:
{'A': 1, 'C': 333, 'B': 22, 'D': 4}
利用这样方便的方法,我们可以很容易地做到字典的合并。在一些特定的情况下,我们需要对字典的合并有更多控制。比如,如果有相同的key,我们不希望做简单的覆盖,而是希望value的值是两个value的平均值或者是两个value的和。要实现这样的逻辑,我们需要对dict的基本操作更加熟练。