python - 如何从Python中的字典列表中合并字典?

标签 python python-2.7 dictionary

我在这个问题上绞尽脑汁很久了,现在把它交给聪明的人了。我有一个字典列表(列表的长度可以从 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/

相关文章:

python - 如何在不使用 for 循环的情况下注释/聚合列表中的每个项目 (Django)

python - 使用 argparse 传递给 python 脚本的文件类型检查参数

Python namedtuple 作为 apply_async(..) 回调的参数

Python2 在 Pandas DataFrame 中选择数据的速度比 Python3 快......为什么?

Python:os.isfile() 和 os.listdir() 之间的分歧

python - Pandas分类数据: Storing the transformation

Python:使用excel文件中的数据创建字典

python - 如何使用 numpy.timedelta 添加(或减去)1 个月?

python - 工作线程内的 Queue.put 失败

android - 从字典、内容提供者、Android 中获取单词