2013-08-06 129 views
1

我已经把这个问题困扰了很长时间,现在我已经把它交给了更聪明的人。我有一个列表(列表的长度可以在1到100之间变化)。这些列表大部分重复,其中一个或两个值有所不同。所有字典的键总是保持不变。一个例子是象下面这样:如何合并Python中的字典列表中的字典?

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]也是一样的。

我要的是实现一个功能合并(myList中),这将给像这样的输出:

newList = [ 
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : "v41"}, 
{"k1" : "v12", "k2" : "v22", "k3" : "v32", "k4" : ""} 
] 

非常感谢提前对你的帮助。

干杯, Paritosh

+4

那么,为什么'“K3”: “”被忽略?什么是合并规则,*完全*? –

+0

可能的重复[如何将一列字典合并为一个字典?](http://stackoverflow.com/questions/3494906/how-do-i-merge-a-list-of-dicts-into-单个词典) – Marcin

+0

合并规则是:如果两个词典具有最大数量的重复值(对应的键),则合并它们。它不是所有提到的问题的重复,因为我不想将所有的字典合并成一个字典,所以具有最大可能的公共值的字典应该合并。如果所有的字典都有不同的值,他们就不应该合并。 – Paritosh

回答

2

我会收集所有的值到defaultdictset值,然后解压缩值回单独的字典;从一些实验,我猜你要忽略空值,并且只将它们放回弥补输出词典:

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

我检查了解决方案。它对于给定的值非常适用。但是,如果我们稍微复杂一点,它就会失败。例如,“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“:”“}, {”k1“:”v12“,”k2“:”v23“,”k3“ v33“,”k4“:”v43“} ]'。我期望与myList [5]的输出作为单独的字典,因为最大值不是愚蠢的。 – Paritosh

相关问题