Wie man zwei Wörterbücher in Python 2 und 3 zusammenführen kann

  1. Python 2.7 Wörterbuch zusammenführen
  2. Python 3.5 (und höher) Wörterbuch-Mischmethode
  3. Merge Methods Conclusion

Angenommen, wir haben zwei Wörterbücher A und B, die zusammengeführt werden sollen, wobei die Werte in B die Werte in A ersetzen, wenn sie denselben key haben.

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}

Das Python dictionary Objekt hat eine intrinsische Methode update(), um das Wörterbuch A mit B zu aktualisieren,

A.update(B)

Aber die Daten von A werden an Ort und Stelle ersetzt, anstatt ein neues Wörterbuch mit der Verschmelzung von A und B zurückzugeben.

Wir werden die Methoden vorstellen, wie man zwei Wörterbücher zusammenführen und ein neues Wörterbuch zurückgeben kann.

Python 2.7 Wörterbuch zusammenführen

Wörterbuch-Verstehensmethode - 1

C = {key: value for d in (A, B) for key, value in d.items()}

d.itmes() gibt eine Liste von (key, value) Paaren als 2-Tupel des Wörterbuchs d zurück.

Diese Methode benutzt das nested dictionary comprehension, um zwei Wörterbücher zusammenzuführen. Die richtige Reihenfolge von for sollte besonders beachtet werden. Sie sollte es sein,

flattern_patterns = [planet
                    for sublist in planets
                    for planet in sublist]

Lexikon-Verstehensmethode - 2

Wir könnten auch die dict() Methode verwenden, um das neue Wörterbuch zu initialisieren.

C = dict((key, value) for d in (A, B) for key, value in d.items())

Technisch gesehen ist sie fast die gleiche wie die obige Methode, unterscheidet sich aber in der Leistung, die im Folgenden erwähnt wird.

itertools.chain Methode

Das itertools Modul standardisiert einen Kernsatz von iterator Bausteinen. Es hat Eigenschaften wie schnell und speichereffizient.

itertools.chain gibt ein Kettenobjekt zurück, dessen .next() Methode Elemente vom ersten Iterator bis zur Erschöpfung zurückgibt, dann den/die nächsten Iterator(en), bis alle erschöpft sind.

dict(itertools.chain(A.iteritems(), B.iteritems()))

iteritems() gibt einen Iterator über die (key, value) Elemente des Wörterbuchs zurück.

Daher geben die obigen Skripte ein Wörterbuch zurück, das die Einträge von A und B enthält.

Kopieren und Aktualisieren Methode

Wie eingangs erwähnt, könnte update() A und B zusammenführen, ersetzt aber das Wörterbuch an Ort und Stelle. Wir könnten die copy() Methode benutzen, um eine Kopie des Wörterbuchs A zu erstellen.

m = A.copy()
C = m.update(B)

Merge-Methoden Leistungsanalyse und Vergleich

import timeit

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}

SETUP_CODE = '''
A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
{key: value for d in (A, B) for key, value in d.items()}
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

TEST_CODE = '''
dict((key, value) for d in (A, B) for key, value in d.items())
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

TEST_CODE = '''
dict(itertools.chain(A.iteritems(), B.iteritems()))
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

SETUP_CODE = '''
def merge_dicts(a, b):
    m = a.copy()
    m.update(b)
    return m

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
merge_dicts(A, B)
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

Das Ergebnis ist

0.0162378
0.029774
0.019975
0.0110059
Methode Leistung Rang
{key: value for d in (A, B) for key, value in d.items()} 0.0162378 2
dict((key, value) for d in (A, B) for key, value in d.items()) 0.029774 4
dict(itertools.chain(A.iteritems(), B.iteritems())) 0.019975 3
merge_dicts(a, b) 0.0110059 1

Python 3.5 (und höher) Wörterbuch-Mischmethode

Ab Python 3.5 hat es neben den gleichen Methoden wie in Python 2.7 auch den ** Entpackungsoperator von Wörterbuch, wie in PEP-448 eingeführt. Er erlaubt das Entpacken einer beliebigen Anzahl von Elementen.

Achtung

d.iteritems() wird in Python 3 veraltet. Siehe PEP-469

>>> C = {**A, **B}
>>> C
{'x': 10, 'y': 30, 'z': 40}
import timeit

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}

SETUP_CODE = '''
A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
{**A, **B}
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

TEST_CODE = '''
{key: value for d in (A, B) for key, value in d.items()}
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

TEST_CODE = '''
dict((key, value) for d in (A, B) for key, value in d.items())
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

TEST_CODE = '''
dict(itertools.chain(A.items(), B.items()))
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

SETUP_CODE = '''
def merge_dicts(a, b):
    m = a.copy()
    m.update(b)
    return m

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
merge_dicts(A, B)
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))
0.0017047999999999508
0.009127499999999955
0.0168952
0.01078009999999996
0.005767999999999995
Methode Leistung Rang
{**A, **B} 0.0017047999999999508 1
{key: value for d in (A, B) for key, value in d.items()} 0.009127499999999955 3
dict((key, value) for d in (A, B) for key, value in d.items()) 0.0168952 5
dict(itertools.chain(A.items(), B.items())) 0.01078009999999996 4
merge_dicts(a, b) 0.005767999999999995 2

Merge Methods Conclusion

In Python 2.7 ist Kopieren und Aktualisieren die beste Methode.

m = A.copy()
C = m.update(B)

In Python 3.5+ ist die Methode zum Entpacken von Wörterbüchern die beste.

{**A, **B}

Verwandter Artikel - Python dictionary

  • Wie man Wörterbuchschlüssel als Liste in Python erhält
  • Wie man ein Python-Wörterbuch nach Wert sortiert
  • comments powered by Disqus