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

  1. Python 2.7 Dictionary zusammenführen
  2. Python 3.5 (und höher) Dictionary-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 Dictionary A mit B zu aktualisieren,

A.update(B)

Aber die Daten von A werden an Ort und Stelle ersetzt, anstatt ein neues Dictionary 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 Dictionary zurückgeben kann.

Python 2.7 Dictionary zusammenführen

Dictionary-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 Dictionaries 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 Dictionary 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 Dictionaries zurück.

Daher geben die obigen Skripte ein Dictionary 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 Dictionary an Ort und Stelle. Wir könnten die copy() Methode benutzen, um eine Kopie des Dictionaries 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) Dictionary-Mischmethode

Ab Python 3.5 hat es neben den gleichen Methoden wie in Python 2.7 auch den ** Entpackungsoperator von Dictionary, 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 ein Dictionary in Python kopiert
  • Wie man ein Python-Dictionary nach Wert sortiert