合并字典的多种方法

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}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值