现在有两个字典:
x = {'a':1,'b':2}y = {'b':10,'c':11}
如何将这两个字典合并成一个新的字典z,有看过我之前写的文章可能会知道使用,一个接受多个字典并将它们在逻辑上变为一个字典。为什么说在逻辑上?因为类只是在内部创建了一个容纳这些字典的列表,并重新定义了一些常见的字典操作来遍历这个列表,并没有真正的创建字典。
fromcollectionsimportChainMapz = ChainMap(x, y)print(z)
# 字典的常用操作不变
print(list(z.values()))print(list(z.keys()))
ChainMap({‘a’: 20, ‘b’: 2}, {‘b’: 10, ‘c’: 11})
[11, 20, 2]
[‘c’, ‘a’, ‘b’]
如果字典中有相同的键,默认使用第一个字典中的键值,比如上面的x和y中都有键,那么z中的键b的值为2。
print(z['b'])
2
如果我们更新z中的键值,会发生什么。
z['a'] =20
print(x)
{‘a’: 20, ‘b’: 2}
可以看到,改变z中键的值,合并前字典中的值也会改变。反过来亦可以。
除了上面说的ChainMap方法外,有没有其他更简便的方法?或者我希望当两个字典中的键一样时,默认使用第二个字典中的值呢?
如果使用的python版本是3.5以上的话,有一个很简便的方法合并两个字典:
z = {**x, **y}print(z)
{‘a’: 20, ‘b’: 10, ‘c’: 11}
amazing!
如果你的python版本低于3.5呢,或是项目中使用的是更低版本的python,怎么做。
defmerge_two_dicts(x, y):
# 做一份潜复制
z = x.copy()
# 更新z中的键值
z.update(y)
returnzz = merge_two_dicts(x, y)print(z)
{‘a’: 20, ‘b’: 10, ‘c’: 11}
在上面的函数中,使用update方法将两个字典合并。当然了,如果要合并多个字典也是可以的,把原来的代码大概修改一下:
defmerge_dicts(*dict_args):
result = {}
fordictionaryindict_args: result.update(dictionary)
returnresult
使用可变参数传入多个字典。
不过,需要注意的是,除了ChainMap方法外,另外两种方法在字典中的键相同时,默认使用最后一个字典中的值,而且改变原来字典的键值不会影响到合并之后的结果,反之亦然。因为这两种操作都是生成了一个新的字典类型。
x = {'a':1,'b':2}y = {'b':10,'c':11}z = merge_dicts(x, y)print(z)x['a'] =20print(x)print(z)z_ = {**x, **y}print(z_)x['a'] =30print(z_)
{‘a’: 1, ‘b’: 10, ‘c’: 11}
{‘a’: 20, ‘b’: 2}
{‘a’: 1, ‘b’: 10, ‘c’: 11}
{‘a’: 20, ‘b’: 10, ‘c’: 11}
{‘a’: 20, ‘b’: 10, ‘c’: 11}
有什么问题,可以在下面留言哈。
领取专属 10元无门槛券
私享最新 技术干货