Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to concatenate two dictionaries to create a new one in Python? [duplicate]

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} 
like image 825
timy Avatar asked Nov 23 '09 07:11

timy


People also ask

Can we concatenate two dictionaries in Python?

Using | in Python 3.9 In the latest update of python now we can use “|” operator to merge two dictionaries. It is a very convenient method to merge dictionaries.


2 Answers

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

like image 86
Alex Martelli Avatar answered Sep 22 '22 11:09

Alex Martelli


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.

like image 33
Amber Avatar answered Sep 19 '22 11:09

Amber