如何快速合并两个字典

现在有两个字典:

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}

有什么问题,可以在下面留言哈。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171216A0O08600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券