Hoe te concateren twee woordenboeken om een ​​nieuwe in Python te maken? [DUPLICEER]

Zeg dat ik drie dictten heb

d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}

Hoe maak ik een nieuwe d4die deze drie woordenboeken combineert? d.w.z.:

d4={1:2,3:4,5:6,7:9,10:8,13:22}

Antwoord 1, Autoriteit 100%

  1. langzaamst en werkt niet in Python3: Concatenate de itemsen bel dictop de resulterende lijst:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = dict(d1.items() + d2.items() + d3.items())'
    100000 loops, best of 3: 4.93 usec per loop
    
  2. Snelst: Exploiteer de dictConstructor naar de HILT, DAN ONE update:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = dict(d1, **d2); d4.update(d3)'
    1000000 loops, best of 3: 1.88 usec per loop
    
  3. Middling: een lus van updateroept een aanvankelijk leeg dict op:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = {}' 'for d in (d1, d2, d3): d4.update(d)'
    100000 loops, best of 3: 2.67 usec per loop
    
  4. of, equivalent, één kopie-ctor en twee updates:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = dict(d1)' 'for d in (d2, d3): d4.update(d)'
    100000 loops, best of 3: 2.65 usec per loop
    

Ik raad benadering (2) aan, en ik raad vooral aan om (1) te vermijden (wat ook O(N) extra hulpgeheugen in beslag neemt voor de aaneengeschakelde lijst met tijdelijke gegevensstructuur van items).


Antwoord 2, autoriteit 54%

d4 = dict(d1.items() + d2.items() + d3.items())

alternatief (en zogenaamd sneller):

d4 = dict(d1)
d4.update(d2)
d4.update(d3)

Vorige SO-vraag waar beide antwoorden vandaan kwamen, is hier.


Antwoord 3, autoriteit 28%

U kunt de update()methode om een nieuw woordenboek te bouwen dat alle items bevat:

dall = {}
dall.update(d1)
dall.update(d2)
dall.update(d3)

Of, in een lus:

dall = {}
for d in [d1, d2, d3]:
  dall.update(d)

Antwoord 4, autoriteit 13%

Hier is een one-liner (importstellen niet 🙂 die gemakkelijk kan worden gegeneraliseerd om N woordenboeken samen te voegen:

Python 3

from itertools import chain
dict(chain.from_iterable(d.items() for d in (d1, d2, d3)))

en:

from itertools import chain
def dict_union(*args):
    return dict(chain.from_iterable(d.items() for d in args))

Python 2.6 & amp; 2,7

from itertools import chain
dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3))

Uitvoer:

>>> from itertools import chain
>>> d1={1:2,3:4}
>>> d2={5:6,7:9}
>>> d3={10:8,13:22}
>>> dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3)))
{1: 2, 3: 4, 5: 6, 7: 9, 10: 8, 13: 22}

Gegeneraliseerd om N dictaten samen te voegen:

from itertools import chain
def dict_union(*args):
    return dict(chain.from_iterable(d.iteritems() for d in args))

Ik ben een beetje laat voor dit feestje, ik weet het, maar ik hoop dat iemand hier iets aan heeft.


Antwoord 5, autoriteit 11%

Gebruik de dict-constructor

d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}
d4 = reduce(lambda x,y: dict(x, **y), (d1, d2, d3))

Als functie

from functools import partial
dict_merge = partial(reduce, lambda a,b: dict(a, **b))

De overhead van het maken van tussenliggende woordenboeken kan worden geëlimineerd door dedict.update()-methode te gebruiken:

from functools import reduce
def update(d, other): d.update(other); return d
d4 = reduce(update, (d1, d2, d3), {})

Other episodes