我在这个问题上绞尽脑汁很久了,现在把它交给聪明的人了。我有一个字典列表(列表的长度可以从 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': ''}]
关于python - 如何从Python中的字典列表中合并字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18089908/