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的基本操作更加熟练。