[英]How to merge dicts from a list of dicts in python?
我已经为此花费了很长时间,现在将其交给更明智的人。 我有一个字典列表(列表的长度可以从1到100秒不等)。 这些列表大部分具有重复项,其中一个或两个值有所不同。 所有字典的键始终保持不变。 一个例子如下:
myList = [
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : "v41"},
{"k1" : "v12", "k2" : "v22", "k3" : "", "k4" : ""},
{"k1" : "v11", "k2" : "v21", "k3" : "", "k4" : "v41"},
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : ""},
{"k1" : "v12", "k2" : "v22", "k3" : "v32", "k4" : ""}
]
现在我知道myList [0],myList [2]和myList [3]相同,因为它们的大多数当前值相同。 同样,myList [1]和myList [4]相同。
我想要的是实现一个功能merge(myList),它将给出这样的输出:
newList = [
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : "v41"},
{"k1" : "v12", "k2" : "v22", "k3" : "v32", "k4" : ""}
]
在此先感谢您的帮助。
干杯,帕里托什
我将所有值收集到带有set
值的defaultdict
,然后将这些值解压缩到单独的字典中; 通过一些实验,我猜测您想忽略空值,而只将它们放回去以组成输出字典:
from collections import defaultdict
from itertools import izip_longest
values = defaultdict(set)
for map in myList:
for key, value in map.iteritems():
if value:
values[key].add(value)
keys = list(values)
newList = [dict(zip(keys, row)) for row in izip_longest(*(sorted(v) for v in values.itervalues()), fillvalue='')]
现在我们得到:
[{'k1': 'v11', 'k2': 'v21', 'k3': 'v31', 'k4': 'v41'},
{'k1': 'v12', 'k2': 'v22', 'k3': 'v32', 'k4': ''}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.