在列表中添加相同字典的值

时间:2019-10-14 18:39:09

标签: python-3.x dictionary

我有一个相同的字典列表(相同的键,相同数量的键..)..像这样:

 mydict_list =   [
        {'win32': [2, 45], 'https': [2, 13], 'nofollow': [3, 45], 'href': [4, 847]},
        {'win32': [0, 5], 'https': [0, 13], 'nofollow': [1, 5], 'href': [2, 87]}
    ]

我想创建一个字典,它的键和值加起来很好。

{'win32': [2, 50], 'https': [2, 26], 'nofollow': [4, 50], 'href': [6, 934]}

有一种优雅的方法吗?

这就是我的工作。它可以正常工作并且可读:

keys = list(mydict_list[0].keys())
final_dict = {item: [] for item in keys}

for k in list(final_dict.keys()):
    v0 = v1 = 0
    for d in mydict_list:
        for kk, v in d.items():
             if k == kk:
                 v0 += v[0]
                 v1 += v[1]
                 final_dict.update({k: [v0, v1]})

2 个答案:

答案 0 :(得分:1)

简短方法:

lst = [
    {'win32': [2, 45], 'https': [2, 13], 'nofollow': [3, 45], 'href': [4, 847]},
    {'win32': [0, 5], 'https': [0, 13], 'nofollow': [1, 5], 'href': [2, 87]}
]

res = lst[0]   # start with the 1st dict
for d in lst[1:]:
    for k, v in d.items():
        res[k] = list(map(sum, zip(v, res[k])))
print(res)

输出:

{'win32': [2, 50], 'https': [2, 26], 'nofollow': [4, 50], 'href': [6, 934]}

答案 1 :(得分:0)

考虑对此使用字典理解,以使其更具“ pythonic”性(尽管可读性明显下降)

 d1=[
    {'win32': [2, 45], 'https': [2, 13], 'nofollow': [3, 45], 'href': [4, 847]},
    {'win32': [0, 5], 'https': [0, 13], 'nofollow': [1, 5], 'href': [2, 87]}
]

可以采用两层式进行(几乎在所有情况下都应该通用)。假设数组中每个字典的所有键都相同。

d2={key:[d[key] for d in d1] for key in d1[0].keys()}
d3={key:[sum(d3) for d3 in list(map(list,zip(*d2[key])))] for key in d1[0].keys()}

print(d3)

{'win32': [2, 50], 'https': [2, 26], 'nofollow': [4, 50], 'href': [6, 934]}

说明

借助字典理解,您可以折叠数组,以便我们可以分别处理每个键。 在第一步中,我们创建d2,它由d1重新排列。

一旦有了适当的位置,d3list-map就会重新排列数组,以便您可以使用内置总和作为列表推导的一部分,对每个列表元素进行明智的求和。

如果将数据存储为numpy数组,则此过程的执行速度可能会大大提高(按原样,这会降低内存效率)。