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

Jinku Hu 30 Januar 2023
  1. Python 2.7 Dictionary zusammenführen
  2. Python 3.5 (und höher) Dictionary-Mischmethode
  3. Merge Methods Conclusion
Wie man zwei Wörterbücher in Python 2 und 3 zusammenführen kann

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.

copy 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 copy und Aktualisieren die beste Methode.

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

In Python 3.5+ ist die Methode zum Entpacken von Dictionaries die beste.

{**A, **B}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - Python Dictionary