dictionary - how to concatenate two dictionaries to create a new one in Python?

ID : 10114

viewed : 40

Tags : pythondictionaryconcatenationpython

Top 5 Answer for dictionary - how to concatenate two dictionaries to create a new one in Python?

vote vote

92

  1. Slowest and doesn't work in Python3: concatenate the items and call dict on 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 loop 
  2. Fastest: exploit the dict constructor to the hilt, then 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: a loop of update calls 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 loop 
  4. Or, 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).

vote vote

83

d4 = 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.

vote vote

79

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

67

Here'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.

vote vote

54

Use 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), {}) 

Top 3 video Explaining dictionary - how to concatenate two dictionaries to create a new one in Python?

Related QUESTION?