1

我为此绞尽脑汁很长时间,现在将其交给更聪明的人。我有一个字典列表(列表的长度可以从 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" : ""}
]

非常感谢您的帮助。

干杯,帕里托什

4

1 回答 1

2

我会将所有值收集到defaultdictwith setvalues 中,然后将这些值解压缩回单独的字典中;通过一些实验,我猜你想忽略空值,只把它们放回去组成输出字典:

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': ''}]
于 2013-08-06T20:39:45.207 回答