it-swarm.com.de

Wie füge ich Wörterbücher in Python zusammen?

d3 = dict(d1, **d2)

Ich verstehe, dass dies das Wörterbuch zusammenführt. Aber ist es einzigartig? Was ist, wenn d1 den gleichen Schlüssel wie d2 hat, aber einen anderen Wert hat? Ich möchte, dass d1 und d2 zusammengeführt werden, aber d1 hat Priorität, wenn ein doppelter Schlüssel vorhanden ist.

84
TIMEX

Sie können die Methode .update() verwenden, wenn Sie den ursprünglichen d2 nicht mehr benötigen:

Aktualisieren Sie das Wörterbuch mit den Schlüssel/Wert-Paaren anderer , um vorhandene Schlüssel zu überschreiben. Rückgabe None.

Z.B.:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'b': 1, 'c': 3}
>>> d2.update(d1)
>>> d2
{'a': 1, 'c': 3, 'b': 2}

Update:

Natürlich können Sie das Wörterbuch zuerst kopieren, um ein neues zusammengefügtes zu erstellen. Dies kann oder ist nicht notwendig. Falls Sie zusammengesetzte Objekte (Objekte, die andere Objekte wie Listen oder Klasseninstanzen enthalten) in Ihrem Wörterbuch enthalten, sollte copy.deepcopy ebenfalls berücksichtigt werden.

148
Felix Kling

In Python2

d1={'a':1,'b':2}
d2={'a':10,'c':3}

d1 überschreibt d2: 

dict(d2,**d1)
# {'a': 1, 'c': 3, 'b': 2}

d2 überschreibt d1:

dict(d1,**d2)
# {'a': 10, 'c': 3, 'b': 2}

Dieses Verhalten ist nicht nur ein Zufall der Umsetzung. es ist garantiert in der Dokumentation :

Wenn in .__ ein Schlüssel angegeben ist. Positionsargument und als Schlüsselwort Argument, der mit .__ verknüpfte Wert. Das Schlüsselwort wird in der .__ beibehalten. Wörterbuch.

40
unutbu

Wenn d1 in den Konflikten Vorrang haben soll, führen Sie folgende Schritte aus:

d3 = d2.copy()
d3.update(d1)

Andernfalls d2 und d1 umkehren.

14
tzot

Trey Hunner hat einen Nice Blog Post , der verschiedene Optionen zum Zusammenführen mehrerer Wörterbücher umreißt, einschließlich (für Python3.3 +) ChainMap und Dictionary - Auspacken .

1
pfctdayelise

Meine Lösung ist die Definition einer merge - Funktion. Es ist nicht raffiniert und kostet nur eine Zeile. Hier ist der Code in Python 3.

from functools import reduce
from operator import or_

def merge(*dicts):
    return { k: reduce(lambda d, x: x.get(k, d), dicts, None) for k in reduce(or_, map(lambda x: x.keys(), dicts), set()) }

Tests

>>> d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> d_letters = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d, d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d_letters, d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> merge(d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge()
{}

Es funktioniert für eine beliebige Anzahl von Wörterbuchargumenten. Gab es doppelte Schlüssel in diesem Wörterbuch, gewinnt der Schlüssel aus dem rechten Wörterbuch der Argumentliste.

1
Lei Zhao

Ich glaube, dass, wie oben erwähnt, die Verwendung von d2.update(d1) der beste Ansatz ist und dass Sie d2 auch zuerst kopieren können, wenn Sie ihn noch benötigen.

Ich möchte jedoch darauf hinweisen, dass dict(d1, **d2) in der Regel eine schlechte Methode ist, um Dictionnaries im Allgemeinen zusammenzuführen, da Schlüsselwortargumente Zeichenfolgen sein müssen. Daher schlägt es fehl, wenn Sie eine dict haben:

{
  1: 'foo',
  2: 'bar'
}
0