我有一个相同的字典列表(相同的键,相同数量的键..)..像这样:
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]})
答案 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重新排列。
一旦有了适当的位置,d3
和list-map
就会重新排列数组,以便您可以使用内置总和作为列表推导的一部分,对每个列表元素进行明智的求和。
如果将数据存储为numpy数组,则此过程的执行速度可能会大大提高(按原样,这会降低内存效率)。