Wie man zwei Wörterbücher in Python 2 und 3 zusammenführen kann
- Python 2.7 Dictionary zusammenführen
- Python 3.5 (und höher) Dictionary-Mischmethode
- 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.
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.
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}
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