如何将两个包含字典的列表与相似的键组合?

时间:2017-02-15 16:43:45

标签: python list dictionary

假设有两个python列表具有相同的结构:

var1 = [{'a':1,'b':2},{'c':2,'d':5,'h':4},{'c':2,'d':5,'e':4}]
var2 = [{'a':3,'b':2},{'c':1,'d':5,'h':4},{'c':5,'d':5,'e':4}]

在我的情况下,我需要结合这两个列表,所以我会得到这个值:

result = [{'a':4,'b':4},{'c':3,'d':10,'h':8},{'c':7,'d':10,'e':8}]

我该怎么做?

6 个答案:

答案 0 :(得分:5)

zip - 基于单线理解:

result = [{k: d1[k]+d2[k] for k in d1} for d1, d2 in zip(var1, var2)]

这假设同一索引处的两个dicts始终具有相同的密钥集。

答案 1 :(得分:2)

使用list comprehensions将代码放在一行中,

result = [{key : d1.get(key, 0)+d2.get(key, 0) 
            for key in set(d1.keys()) | set(d2.keys())}     # union two sets
            for d1, d2 in zip(var1, var2)]

print(result)
[{'a': 4, 'b': 4}, {'h': 8, 'c': 3, 'd': 10}, {'c': 7, 'e': 8, 'd': 10}]

此代码考虑了两个词典可能没有相同键的情况。

答案 2 :(得分:0)

enter code here

答案 3 :(得分:0)

var1 = [{'a': 1, 'b': 2}, {'c': 2, 'd': 5, 'h': 4}, {'c': 2, 'd': 5, 'e': 4}]
var2 = [{'a': 3, 'b': 2}, {'c': 1, 'd': 5, 'h': 4}, {'c': 5, 'd': 5, 'e': 4}]

ret = []

for i, ele in enumerate(var1):
    d = {}
    for k, v in ele.items():
        value = v
        value += var2[i][k]
        d[k] = value
    ret.append(d)

print(ret)

答案 4 :(得分:0)

为了完整起见,另一个基于拉链的单线程即使两个列表中的字母不均匀也能正常工作:

result = [{k: d1.get(k, 0) + d2.get(k, 0) for k in set(d1) | set(d2)} for d1, d2 in zip(var1, var2)]

答案 5 :(得分:0)

这样的事情有帮助吗?

ar1 = [{'a':1,'b':2},{'c':2,'d':5,'h':4},{'c':2,'d':5,'e':4}]
var2 = [{'a':3,'b':2},{'c':1,'d':5,'h':4},{'c':5,'d':5,'e':4}]

combined_var = zip(var1, var2)

new_d = {}
list_new_ds = []

for i, j in combined_var:
    new_d = {}
    for key in i and j:
        new_d[key] = i[key] + j[key]
    list_new_ds.append(new_d)

list_new_ds = [{'a': 4, 'b': 4}, {'h': 8, 'c': 3, 'd': 10}, {'c': 7, 'e': 8, 'd': 10}]

为了解释,zip函数将列表合并为元组列表。然后我解压缩元组并遍历每个字典中的键,并使用新字典将相同键的值添加到一起以存储它们。然后我将值附加到列表中,然后在查看压缩列表中的下一个元组之前将临时字典重新初始化为空。

由于我相信词典的行为,顺序不同。

我是新手,所以对我的回答有任何批评感激不尽!