2013-08-06 137 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

相關問題