2016-07-11 8 views
0

Ich habe versucht, ein Python-Wörterbuch zu invertieren, d. H. Aus einem Original dict alle Werte, erhalten eine eindeutige Menge und verwenden diese als Schlüssel für ein neues Diktat. Die Werte für die neuen Schlüssel sollten eine Liste der ursprünglichen dict-Schlüssel sein, die den neuen dict-Schlüssel als Wert hatten.Invert Wörterbuch mit Satz von Werten aus dem ursprünglichen dict Werte

Sicherlich gibt es bessere Möglichkeiten, aber ich kam mit:

myDict1 = {'foo0':'alpha','foo1':'alpha','bar0':'beta','bar4':'beta'} 
tmpDict = dict.fromkeys(set(myDict1.values()),[]) 
for thingy in myDict1.keys(): 
    tmpDict[myDict1[thingy]].append(thingy) 
print(tmpDict) 

geben tmpDict als:

{'alpha': ['bar0', 'foo0', 'foo1', 'bar4'], 'beta': ['bar0', 'foo0', 'foo1', 'bar4']} 

, die nicht die erwartete dict ist:

{'alpha': ['foo0', 'foo1'], 'beta': ['bar0', 'bar4']} 

Wo liegt der Fehler?

+0

Warum haben Sie 'set (myDict1.keys())'? 'for dingy in myDict1' würde sich identisch verhalten. – jonrsharpe

+0

Das ist wahrscheinlich nur ein Überbleibsel, während ich versuche, es zum Laufen zu bringen und Dinge zu bewegen - ich sehe keinen Grund, warum ich es jetzt dort hinzugefügt habe. Ich habe die Frage bearbeitet. Danke für das Zeigen auf die vorherige Frage! Gut zu wissen über das referenzielle Verhalten von 'fromkeys()' etc.! – THX

Antwort

1

Wenn Sie fromkeys verwenden, zeigen alle Schlüssel auf das gleiche Objekt. In diesem Fall wird eine Liste:

dict.fromkeys(set(myDict1.values()),[]) 

Ich würde vorschlagen, mit:

dict((k, []) for k in set(myDict1.values())) 

die eine neue Liste für jeden Schlüssel erstellen würde.