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 d4
die deze drie woordenboeken combineert? d.w.z.:
d4={1:2,3:4,5:6,7:9,10:8,13:22}
Antwoord 1, Autoriteit 100%
-
langzaamst en werkt niet in Python3: Concatenate de
items
en beldict
op 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
-
Snelst: Exploiteer de
dict
Constructor naar de HILT, DAN ONEupdate
:$ 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
-
Middling: een lus van
update
roept 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
-
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 (imports
tellen 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), {})