Say I have three dicts
d1={1:2,3:4} d2={5:6,7:9} d3={10:8,13:22} How do I create a new d4 that combines these three dictionaries? i.e.:
d4={1:2,3:4,5:6,7:9,10:8,13:22} 15 Answers
Slowest and doesn't work in Python3: concatenate the
itemsand calldicton the resulting list:$ 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 loopFastest: exploit the
dictconstructor to the hilt, then 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 loopMiddling: a loop of
updatecalls on an initially-empty dict:$ 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 loopOr, equivalently, one copy-ctor and two 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
I recommend approach (2), and I particularly recommend avoiding (1) (which also takes up O(N) extra auxiliary memory for the concatenated list of items temporary data structure).
13d4 = dict(d1.items() + d2.items() + d3.items()) alternatively (and supposedly faster):
d4 = dict(d1) d4.update(d2) d4.update(d3) Previous SO question that both of these answers came from is here.
5You can use the update() method to build a new dictionary containing all the items:
dall = {} dall.update(d1) dall.update(d2) dall.update(d3) Or, in a loop:
dall = {} for d in [d1, d2, d3]: dall.update(d) 4Here's a one-liner (imports don't count :) that can easily be generalized to concatenate N dictionaries:
Python 3
from itertools import chain dict(chain.from_iterable(d.items() for d in (d1, d2, d3))) and:
from itertools import chain def dict_union(*args): return dict(chain.from_iterable(d.items() for d in args)) Python 2.6 & 2.7
from itertools import chain dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3)) Output:
>>> 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} Generalized to concatenate N dicts:
from itertools import chain def dict_union(*args): return dict(chain.from_iterable(d.iteritems() for d in args)) I'm a little late to this party, I know, but I hope this helps someone.
5Use the 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)) As a function
from functools import partial dict_merge = partial(reduce, lambda a,b: dict(a, **b)) The overhead of creating intermediate dictionaries can be eliminated by using thedict.update() method:
from functools import reduce def update(d, other): d.update(other); return d d4 = reduce(update, (d1, d2, d3), {}) 0