如何连接两个字典在Python中创build一个新的字典?

说我有三个词

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

我如何创build一个结合这三个字典的新d4 ? 即:

 d4={1:2,3:4,5:6,7:9,10:8,13:22} 
  1. 最慢:连接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构造函数,然后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调用循环:

     $ 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. 或者相当于一个副本和两个更新:

     $ 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 

我推荐的方法(2),我特别build议避免(1)(它也占用O(N)额外的辅助内存的项目连接列表临时数据结构)。

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

或者(据说更快):

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

以前这样的问题,这两个答案来自于这里 。

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

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

或者,在一个循环中:

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

使用字典的构造函数

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

作为一个function

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

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

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

这是一个单行( 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个字节:

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

我知道这个派对有点晚了,但是我希望这可以帮到别人。