如何连接两个词典在Python中创建一个新词典?

时间:2009-11-23 07:23:32

标签: python dictionary concatenation

说我有三个词组

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

如何创建一个结合这三个词典的新d4?即:

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

5 个答案:

答案 0 :(得分:232)

  1. 速度最慢,在Python3中不起作用:连接items并在结果列表中调用dict

    $ 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. 最快:将dict构造函数用于hilt,然后使用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:update循环调用最初为空的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. 或者,相当于一个copy-ctor和两个更新:

    $ 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
    
  5. 我推荐方法(2),我特别建议避免(1)(它还为项目临时数据结构的连接列表占用O(N)额外辅助内存。)

答案 1 :(得分:102)

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

或者(并且应该更快):

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

以前提出的这两个问题的答案都是here

答案 2 :(得分:51)

您可以使用update()方法构建包含所有项目的新词典:

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

或者,循环:

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

答案 3 :(得分:22)

使用dict构造函数

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

作为一项功能

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

使用dict.update()方法可以消除创建中间词典的开销:

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

答案 4 :(得分:21)

这是一个单行(imports不计数:),可以很容易地推广到连接N个词典:

Python 2.6 +

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

输出:

>>> 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}

广义连接N dicts:

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

Python 3

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

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

我知道,这次聚会有点晚了,但我希望这对某人有所帮助。