如何在python中合并dicts列表中的dicts?

时间:2013-08-06 20:31:58

标签: python python-2.7 dictionary

我已经绞尽脑汁待了很长时间,现在把它交给更聪明的人。我有一个dicts列表(列表的长度可以在1到100之间变化)。这些列表大多数是重复的,其中一个或两个值不同。所有dict的键始终保持不变。一个例子如下:

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" : ""}
]

非常感谢您的帮助。

干杯, Paritosh

1 个答案:

答案 0 :(得分:2)

我会将defaultdict的所有值收集到set,然后将这些值解压缩回单独的词典中;从一些实验中我猜你想要忽略空值并只将它们放回来组成输出字典:

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': ''}]