如何合并字典的列表

3
如何在Python中合并一个字典列表?我有两组数据:
a = [{'date':'1/1/2019'},{'date':'1/1/2020'},{'date':'1/1/2021'}]
b = [{'value':'2'},{'value':'5'},{'value':'6'}]

如何将它合并到下面的结果中?
[{'date':'1/1/2019','value':'2'},
 {'date':'1/1/2020','value':'5'},
 {'date':'1/1/2021','value':'6'}]
5个回答

7
在Python 3.9中,新增了字典的并集操作符,因此以下代码有效:

>>> a = [{'date':'1/1/2019'},{'date':'1/1/2020'},{'date':'1/1/2021'}]
>>> b = [{'value':'2'},{'value':'5'},{'value':'6'}]
>>> [x|y for x,y in zip(a,b)]
[{'date': '1/1/2019', 'value': '2'}, {'date': '1/1/2020', 'value': '5'}, {'date': '1/1/2021', 'value': '6'}]

有关详细信息请参见PEP 584


6
c = [{**a1, **b1} for a1,b1 in zip(a,b)]

这里我使用了列表推导式,**a1和**b1用于解包和映射两个字典列表的键值对。


4

假设两者都是长度相同的dict列表,您可以执行以下操作:

c = [{**item[0], **item[1]} for item in zip(a, b)]

1
太酷了!你能解释一下吗?我有点难以理解它是如何工作的。- 哦...也许我明白了...**_d 就像在函数调用中一样...k1=v1,k2=v2等等...这可以在花括号中定义一个字典,并且甚至可以在同一个花括号中放置多个 **。就是这样吗? - CryptoFool
是的,这就像在任何 **kwargs 出现的地方使用字典推导式一样。 - Pavel
在从b中使用索引获取元素时,无需直接使用a中的枚举和获取元素。请改用zip()。此外,我不知道为什么您在_d的名称中加入了下划线,这似乎是随意的,并且只是为了使初学者更难以阅读和理解。 - theberzi
theberzi - 确实,谢谢。zip 可能更清晰。我加下划线是因为 _d 只是循环中的一个变量,不要与其他 a 搞混了。 - Pavel

2

[{**i[0],**i[1]} for i in zip(a,b)]


哎呀,我想我来晚了 :) - brunoff
没问题。我喜欢你的更好一些。它更对称。 - CryptoFool
这似乎过于复杂了:i 是从 ab 中获取的字典元组,你可以直接使用 [{**k,**j} for k, j in zip(a,b)],避免索引列表,这样更快且更易读。 - theberzi

0

有两种方法可以做到这一点。 其中之一是:

for i in range(len(a)):
    a[i].update(b[i])
    
print(a)

如果您拥有 Python 3.9 及以上版本
new_list = [a[i]|b[i] for i in range(len(a))]

检查你的Python版本:

import sys
print (sys.version)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接