Hoe twee woordenboeken samen te voegen in Python 2 en 3

  1. Python 2.7 Woordenboek samenvoegen
  2. Python 3.5 (en hoger) Dictionary Merge Method
  3. Samenvoegmethoden Conclusie

Stel dat we twee dictionary hebben A en B moeten worden samengevoegd, waarbij de waarden in B deze waarden vervangen A als ze dezelfde delen key.

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

Python- dictionary object heeft een instrinsic update() methode om woordenboek A bij te werken met B ,

A.update(B)

Maar de gegevens van A worden op hun plaats vervangen in plaats van een nieuw woordenboek met samenvoeging A en terug te sturen B.

We zullen de methoden introduceren voor het samenvoegen van twee woordenboeken en het retourneren van een nieuw woordenboek.

Python 2.7 Woordenboek samenvoegen

Woordenboek begrijpend methode - 1

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

d.itmes() geeft een lijst met (key, value) paren terug als 2-tuples woordenboek d.

Deze methode gebruikt het geneste woordenboekbegrip om woordenboek twee samen te voegen. De juiste volgorde van for moet extra aandacht worden besteed. Het zou moeten zijn,

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

Woordenboek begrijpend methode - 2

We kunnen ook de dict() methode gebruiken om het nieuwe woordenboek te initialiseren.

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

Technisch gezien is het bijna hetzelfde als de bovenstaande methode, maar verschilt in de prestaties die later worden vermeld.

itertools.chain Methode

itertools module standaardiseert een kernset van iterator bouwstenen. Het heeft functies zoals snel en geheugenefficiënt.

itertools.chain retourneert een .next() ketenobject waarvan de methode elementen retourneert van de eerste iterabele totdat deze is uitgeput, vervolgens de volgende iterabele (n), totdat alle zijn uitgeput.

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

iteritems() geeft een iterator terug over de (key, value) items van het woordenboek.

Daarom retourneren de bovenstaande scripts een woordenboek met items van A en B.

copy en update methode

Zoals in het begin vermeld, update kan samenvoegen A en B , maar zal het woordenboek op zijn plaats vervangen. We kunnen de copy methode gebruiken om een ​​kopie van het woordenboek te maken A.

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

Samenvoegmethoden Prestatieanalyse en vergelijking

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))

Het resultaat is

0.0162378
0.029774
0.019975
0.0110059
Methode Prestatie 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 (en hoger) Dictionary Merge Method

Vanaf Python 3.5 heeft het, naast dezelfde methoden als in Python 2.7, ook de ** exploitant van het uitpakken dictionary , zoals geïntroduceerd in PEP-448 . Hiermee kan je een willekeurig aantal items uitpakken.

Aandacht

d.iteritems() wordt verouderd in Python 3. Zie 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 Prestatie Rang
{**A, **B} ,0017047999999999508 1
{key: value for d in (A, B) for key, value in d.items()} ,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())) ,01078009999999996 4
merge_dicts(a, b) ,005767999999999995 2

Samenvoegmethoden Conclusie

In Python 2.7, copy en update is de beste methode.

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

In Python 3.5+ is de methode voor het uitpakken van woordenboeken de beste.

{**A, **B}

Gerelateerde Artikelen - Python Dictionary

  • Hoe te controleren of een sleutel voorkomt in een woordenboek
  • Alle bestanden van een map ophalen
  • Een bestand en map verwijderen
  • Een woordenboek sorteren op waarde