2012-05-17 9 views
8

Ich habe ein Python-Wörterbuch dict1 mit mehr als 20.000 Tasten und ich möchte update es mit einem anderen Wörterbuch dict2. Die Wörterbücher wie folgt aussehen:Einfügen oder Aktualisieren von Schlüsseln in einem Python-Wörterbuch

dict1 
    key11=>[value11] 
    key12=>[value12] 
    ... 
    ... 
    keyxyz=>[value1x]  //common key 
    ...... so on 

dict2 
    key21=>[value21] 
    key22=>[value22] 
    ... 
    ... 
    keyxyz=>[value2x]  // common key 
    ........ so on 

Wenn ich

dict1.update(dict2) 

verwenden dann die Tasten dict1, die Tasten von dict2 ähnlich sind, werden ihre Werte durch Werte von dict2 überschrieben haben. Was ich will ist, wenn eine Taste bereits in dict1 vorhanden ist, dann sollte der Wert dieser Taste in dict2 an den Wert von dict1 angehängt werden. So

dict1.conditionalUpdate(dict2) 

sollte in Folge

dict1 
    key11=>[value11] 
    key12=>[value12] 
    key21=>[value21] 
    key22=>[value22] 
    ... 
    ... 
    keyxyz=>[value1x,value2x] 

Eine naive Methode für jede Tonart dict1 Schlüssel dict2 iterieren würde und Einfügen oder Aktualisieren von Schlüsseln. Gibt es eine bessere Methode? Unterstützt Python eine eingebaute Datenstruktur, die diese Art von Funktionalität unterstützt?

+0

Hier ist eine Lösung für eine ähnliche Frage bereits geschrieben. http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-as-a-single-expression – ronyswag

+0

@ronyswag Das ist nicht die gleiche Frage. –

Antwort

9

Verwenden Sie defaultdict aus dem Sammlungsmodul.

>>> from collections import defaultdict 
>>> dict1 = {1:'a',2:'b',3:'c'} 
>>> dict2 = {1:'hello', 4:'four', 5:'five'} 
>>> my_dict = defaultdict(list) 
>>> for k in dict1: 
... my_dict[k].append(dict1[k]) 
... 
>>> for k in dict2: 
... my_dict[k].append(dict2[k]) 
... 
>>> my_dict[1] 
['a', 'hello'] 
+1

Korrigieren. In der Tat, wenn Sie die Python-Dokumente auschecken gibt es ein Beispiel, das fast das entspricht, was Sie fordern - http://docs.python.org/library/collections.html#defaultdict-examples –

1

Das ist eigentlich ziemlich einfach ein dict Verständnis und itertools.groupby() zu tun mit:

dict1 = {1: 1, 2: 2, 3: 3, 4: 4} 
dict2 = {5: 6, 7: 8, 1: 1, 2: 2} 

from itertools import groupby, chain 
from operator import itemgetter 

sorted_items = sorted(chain(dict1.items(), dict2.items())) 

print({key: [value[1] for value in values] for key, values in groupby(sorted_items, itemgetter(0))}) 

Gibt uns:

{1: [1, 1], 2: [2, 2], 3: [3], 4: [4], 5: [6], 7: [8]} 

Natürlich ist dies eine neue dict erstellt, aber wenn Sie Notwendigkeit zu update das erste dict, du kannst das trivial machen, indem du mit dem neuen aktualisierst. Wenn Ihre Werte bereits Listen sind, müssen Sie vielleicht ein paar kleinere Änderungen vornehmen (aber ich nehme an, dass Sie dies wegen der Operation getan haben, in diesem Fall besteht keine Notwendigkeit). Wenn Sie Python 2.x verwenden, sollten Sie natürlich dict.viewitems() oder dict.iteritems() über dict.items() verwenden. Wenn Sie eine Version von Python vor Dict-Comprehensions verwenden, können Sie stattdessen dict((key , value) for ...) verwenden.

0

Eine andere Methode, ohne etwas zu importieren, nur mit dem regulären Python-Wörterbuch:

>>> dict1 = {1:'a',2:'b',3:'c'} 
>>> dict2 = {1:'hello', 4:'four', 5:'five'} 
>>> for k in dict2: 
... dict1[k] = dict1.get(k,"") + dict2.get(k) 
... 
>>> dict1 
{1: 'ahello', 2: 'b', 3: 'c', 4: 'four', 5: 'five'} 
>>> 

dict1.get(k,"") kehrt die zu k zugehörige Wert, wenn es anders oder eine leere Zeichenfolge vorhanden ist, und fügen Sie dann den Inhalt von dict2 .

Verwandte Themen