2012-07-12 105 views
12

這可能是Python中的一個經典問題,但我還沒有找到答案。如何將字典列表轉換爲Python中的列表字典?

我有一個詞典列表,這些詞典有類似的鍵。 它看起來像這樣:

[{0: myech.MatchingResponse at 0x10d6f7fd0, 
    3: myech.MatchingResponse at 0x10d9886d0, 
    6: myech.MatchingResponse at 0x10d6f7d90, 
    9: myech.MatchingResponse at 0x10d988ad0}, 
    {0: myech.MatchingResponse at 0x10d6f7b10, 
    3: myech.MatchingResponse at 0x10d6f7f90>}] 

我想獲得一個新的字典[0,3,6,9]作爲鍵,和「myech.MatchingResponse」作爲值的列表。

當然,我可以使用一個簡單的循環來做到這一點,但我想知道是否有更有效的解決方案。

+0

對於反向看(從字典-的-列表列出-的-http://stardict.sourceforge.net/Dictionaries.php下載):https://stackoverflow.com/q/1780174/1959808 – 2017-09-20 01:45:06

+0

相關:https://stackoverflow.com/q/30522982/1959808 – 2017-09-20 01:54:46

回答

18
import collections 

result = collections.defaultdict(list) 

for d in dictionaries: 
    for k, v in d.items(): 
     result[k].append(v) 
+0

這太慢了! – salomonvh 2016-10-14 09:32:23

2

比方說,您的列表被分配給一個名爲mylist的變量。

mydic = {} 
for dic in mylist: 
    for key, value in dic.items(): 
     if key in mydic: 
      mydic[key].append(value) 
     else: 
      mydic[key] = [value] 
+4

使用'dict.setdefault'或'collections.defaultdict'代替這個! :D – jamylak 2012-07-12 11:22:11

+0

thx,我會看看那個。從未使用過setdefault。 – bigblind 2012-07-12 11:23:47

+0

此外,這將不起作用,因爲迭代通過字典迭代通過它的鍵,所以這,'鍵,值在DIC',將引發錯誤。換成'for key,在dic.items()中的值'。編輯:我只是改了它 – jamylak 2012-07-12 11:30:29

1

可以用dict理解來做到這一點......可以是一行,但爲了清晰起見,我已將它保留爲兩行。 :)

from itertools import chain 

all_keys = set(chain(*[x.keys() for x in dd])) 
print {k : [d[k] for d in dd if k in d] for k in all_keys} 

結果:

{0: ['a', 'x'], 9: ['d'], 3: ['b', 'y'], 6: ['c']} 
+0

這不是什麼提問者 – 2012-07-12 12:42:48

+0

@OttoAllmendinger啊..我誤解了這個問題...請看看糾正的解決方案:) – 2012-07-12 13:38:01

+0

我不確定性能,但現在它是一個有效的答案 – 2012-07-12 13:46:21