2012-07-12 20 views
12

To może być klasyczne pytanie w Pythonie, ale jeszcze nie znalazłem odpowiedzi.Jak przekonwertować listę słowników na słownik list w Pythonie?

Posiadam listę słowników, te słowniki mają podobne klucze. Wygląda to tak:

[{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>}] 

Chciałbym dostać nowy słownik z [0,3,6,9] jako klucze i list „myech.MatchingResponse” jako wartości.

Oczywiście mogę to zrobić za pomocą prostej pętli, ale zastanawiałem się, czy istnieje bardziej wydajne rozwiązanie.

+0

Dla rewersu (z dict-of-list do list-of-dicts) patrz: https://stackoverflow.com/q/1780174/1959808 –

+0

Powiązane: https://stackoverflow.com/q/30522982/1959808 –

Odpowiedz

18
import collections 

result = collections.defaultdict(list) 

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

To bardzo wolno! – salomonvh

2

Załóżmy, że twoja lista jest przypisana do zmiennej o nazwie 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

zamiast tego użyj 'dict.setdefault' lub' collections.defaultdict'! : D – jamylak

+0

thx, popatrzę na to. Nigdy nie używał setdefault. – bigblind

+0

Również to nie zadziała, ponieważ iteracja przez słownik iteruje przez jego klawisze, więc ten, 'dla klucza, wartość w dic', spowoduje błąd. zmień na 'dla klucza, wartość w dic.items()'. Edycja: Właśnie zmieniłem to dla ciebie – jamylak

1

Jest możliwe, aby to zrobić z dict zrozumienia, jak również ... może być jedna linia, ale ja trzymał go w postaci dwóch linii dla jasności. :)

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} 

Wyniki w:

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

to nie jest to, co pytający jest po –

+0

@OttoAllmendinger Ah .. źle zrozumiałem problem ... proszę spojrzeć na poprawione rozwiązanie :) –

+0

Nie jestem pewien co do wydajności, ale teraz jest to poprawna odpowiedź –

Powiązane problemy