合并字典的多种方法

update

a = {3: 985}
b = {(3, 4): 'a'}
a.update(b)
print(a)
{3: 985, (3, 4): 'a'}

如果不想改变之前创建的字典,可以使用深层拷贝:

from copy import deepcopy
n = deepcopy(a)
n.update(a)
# 如果不进行深层拷贝而是如下:
c = a
# 那么a改变的时候c也会改变

先解包再合并字典

使用**可以解包字典,解包之后使用dict()或者{}就可以合并

di1 ={'23': 999, 'max': 231}
di2 = {'hello': 0}
j = dict(**di1, **di2)
print(j)
{'23': 999, 'max': 231, 'hello': 0}

上面的代码就相当于:

dict(('23', 999), ('max', 231), ('hello', 0))

解包操作有个限制,就是解包的字典的key一定要是字符。

借助itertools

itertools模块是python中专门处理可迭代对象的内置模块,使用itertools.chain()可以将多个字典(可迭代对象)串联起来,组成一个更大的可迭代对象, 然后使用dict转成字典。

import itertools
a = {3: 985, (3, 4): 'a', 55: 345}
b = {'hello': 0}
dict(itertools.chain(a.items(), di2.items()))
{3: 985, (3, 4): 'a', 55: 345, 'hello': 0}

使用ChainMap

使用ChainMap可以达到和itertools同样的效果:

from collections import ChainMap
a = {3: 985, (3, 4): 'a', 55: 345}
b = {'hello': 0}
dict(ChainMap(a, b))
{'hello': 0, 3: 985, (3, 4): 'a', 55: 345}	

发现它将b字典加在了a的前面。
使用ChainMap有一点需要注意,当字典之间有重复的键的时候,只会取第一个值,排在后面的键值并不会更新掉前面的(使用itertolls就不会有这个问题)。

使用dict.items()合并

在python3.9之前,|操作符主要用于对集合去并集,如果3.9之前要使用它求字典的并集也可以实现,只不过不太好理解:

a = {3: 985, (3, 4): 'a', 55: 345}
b = {'hello': 0}
dict(a.items()|b.items())
{3: 985, 55: 345, (3, 4): 'a', 'hello': 0}

使用list()再合并也可:

dict(list(a.items()) + list(b.items()))
{3: 985, 55: 345, (3, 4): 'a', 'hello': 0}

使用列表解析式

a = {3: 985, (3, 4): 'a', 55: 345}
b = {'hello': 0}
{k: v for d in [a, b] for k, v in d.items()}
{3: 985, (3, 4): 'a', 55: 345, 'hello': 0}

python3.9新特性

a = {3: 985, (3, 4): 'a', 55: 345}
b = {'hello': 0}
a | b
{3: 985, (3, 4): 'a', 55: 345, 'hello': 0}
a |= b
a
{3: 985, (3, 4): 'a', 55: 345, 'hello': 0}
发布了79 篇原创文章 · 获赞 8 · 访问量 3308

猜你喜欢

转载自blog.csdn.net/weixin_43141320/article/details/105460580