2013-11-08 9 views
5

Ich bin zu Python neu und versuche, eine Funktion zu schreiben, die zwei Wörterbuchobjekte in Python zusammenführen wird. Zum BeispielWie zwei Wörterbücher mit denselben Schlüsselnamen zusammengeführt werden

dict1 = {'a':[1], 'b':[2]} 
dict2 = {'b':[3], 'c':[4]} 

Ich brauche eine neue fusionierte Wörterbuch sollte

dict3 = {'a':[1], 'b':[2,3], 'c':[4]} 

Funktion auch einen Parameter „Konflikt“ (auf Wahr oder Falsch), um zu produzieren. Wenn der Konflikt auf "False" (Falsch) gesetzt ist, ist der obige Befehl in Ordnung. Wenn Konflikt auf True gesetzt ist, Code wird das Wörterbuch wie diese statt fusionieren:

dict3 = {'a':[1], 'b_1':[2], 'b_2':[3], 'c':[4]} 

Ich versuche, die zwei Wörterbücher anzuhängen, aber nicht sicher, wie es den richtigen Weg zu tun.

for key in dict1.keys(): 
    if dict2.has_key(key): 
     dict2[key].append(dict1[key]) 
+10

['dict2 [Schlüssel] .Extend (dict1 [Schlüssel])'] (http://StackOverflow.com/Questions/252703/Python-Append-VS-Extend) –

+0

Großartig, danke erweitern tut es richtig Weg, aber ich bin noch nicht in der Lage, 2 Wörterbücher hinzuzufügen. Mit dem Code, den ich habe, bin ich nur auf die Tasten von dict2 hinzufügen. @ John Kugelman –

+4

Huh http://StackOverflow.com/Questions/252703/Python-Append-VS-Extend ist kein exaktes Duplikat. – kennytm

Antwort

4

Wenn Sie eine fusionierte Kopie möchten, die nicht die ursprünglichen dicts ändert und Uhren für Namenskonflikte, könnte man diese Lösung versuchen:

>>> dict1 = {'a': [1], 'b': [2]} 
>>> dict2 = {'b': [3], 'c': [4]} 
>>> import copy 
>>> import itertools 
>>> def merge(a, b, conflict): 
    new = copy.deepcopy(a) 
    if conflict: 
     for key, value in b.items(): 
      if key in new: 
       counter = itertools.count(1) 
       # Rename 1st key. 
       while True: 
        name = '{}_{}'.format(key, next(counter)) 
        if name not in new: 
         new[name] = new[key] 
         del new[key] 
         break 
       # Create 2nd key. 
       while True: 
        name = '{}_{}'.format(key, next(counter)) 
        if name not in new: 
         new[name] = value 
         break 
      else: 
       new[key] = value 
    else: 
     for key, value in b.items(): 
      new.setdefault(key, []).extend(value) 
    return new 

>>> merge(dict1, dict2, False) 
{'c': [4], 'b': [2, 3], 'a': [1]} 
>>> merge(dict1, dict2, True) 
{'b_2': [3], 'b_1': [2], 'c': [4], 'a': [1]} 
2

Ich glaube, Sie dies wünschen:

dict1 = {'a':[1], 'b':[2]} 
dict2 = {'b':[3], 'c':[4]} 

def mergeArray(conflict): 
    for key in dict1.keys(): 
     if dict2.has_key(key): 
      if conflict==False: 
       dict2[key].extend(dict1[key]) 
      else: 
       dict2[key+'_1'] = dict1[key] 
       dict2[key+'_2'] = dict2.pop(key) 
     else: 
      dict2[key] = dict1[key] 

mergeArray(True); 
print dict2 
+1

Großartig, vielen Dank. Genau das habe ich gesucht und es wurde nicht beantwortet (bei Python - append vs. extend) –

Verwandte Themen