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