Frage Union von Diktatobjekten in Python [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Wie berechnen Sie die Vereinigung von zwei? dict Objekte in Python, wobei a (key, value) Paar ist im Ergebnis wenn vorhanden key ist in entweder dict (es sei denn, es gibt Duplikate)?

Zum Beispiel die Vereinigung von {'a' : 0, 'b' : 1} und {'c' : 2} ist {'a' : 0, 'b' : 1, 'c' : 2}.

Vorzugsweise können Sie dies tun, ohne eine Eingabe zu ändern dict. Beispiel wo dies nützlich ist: Erhalte ein Diktat aller derzeit im Gültigkeitsbereich befindlichen Variablen und deren Werte


75
2018-03-22 09:36


Ursprung


Antworten:


Diese Frage bietet ein Idiom. Sie verwenden eines der dicts als Schlüsselwortargumente für die dict() Konstrukteur:

dict(y, **x)

Duplikate werden zugunsten des Wertes in aufgelöst x; beispielsweise

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}

70
2018-03-22 09:37



Sie können auch verwenden update Methode des Diktats wie

a = {'a' : 0, 'b' : 1}
b = {'c' : 2}

a.update(b)
print a

63
2018-03-22 09:54



Zwei Wörterbücher

def union2(dict1, dict2):
    return dict(list(dict1.items()) + list(dict2.items()))

n Wörterbücher

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))

18
2017-10-17 01:56



Wenn beide Dicts unabhängig und aktualisierbar bleiben sollen, können Sie ein einzelnes Objekt erstellen, das beide Wörterbücher in seiner Datenbank abfragt __getitem__ Methode (und implementieren get, __contains__ und andere Mapping-Methode, wie Sie sie brauchen).

Ein minimalistisches Beispiel könnte so aussehen:

class UDict(object):
   def __init__(self, d1, d2):
       self.d1, self.d2 = d1, d2
   def __getitem__(self, item):
       if item in self.d1:
           return self.d1[item]
       return self.d2[item]

Und es funktioniert:

>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __getitem__
KeyError: 3
>>> 

5
2018-03-22 11:24