tim*_*imy 210 python dictionary concatenation
说我有三个词
d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}
Run Code Online (Sandbox Code Playgroud)
如何创建一个d4结合这三个词典的新内容?即:
d4={1:2,3:4,5:6,7:9,10:8,13:22}
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 247
最慢并且在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
Run Code Online (Sandbox Code Playgroud)最快:利用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
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)或者,等效地,一个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
Run Code Online (Sandbox Code Playgroud)我推荐方法(2),我特别建议避免(1)(它还占用O(N)额外辅助内存用于临时数据结构的项目连接列表).
Amb*_*ber 112
d4 = dict(d1.items() + d2.items() + d3.items())
Run Code Online (Sandbox Code Playgroud)
或者(并且应该更快):
d4 = dict(d1)
d4.update(d2)
d4.update(d3)
Run Code Online (Sandbox Code Playgroud)
之前的问题是这两个答案都来自于此.
sth*_*sth 57
您可以使用该update()方法构建包含所有项目的新字典:
dall = {}
dall.update(d1)
dall.update(d2)
dall.update(d3)
Run Code Online (Sandbox Code Playgroud)
或者,在循环中:
dall = {}
for d in [d1, d2, d3]:
dall.update(d)
Run Code Online (Sandbox Code Playgroud)
小智 26
使用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))
Run Code Online (Sandbox Code Playgroud)
作为一个功能
from functools import partial
dict_merge = partial(reduce, lambda a,b: dict(a, **b))
Run Code Online (Sandbox Code Playgroud)
使用以下dict.update()方法可以消除创建中间词典的开销:
from functools import reduce
def update(d, other): d.update(other); return d
d4 = reduce(update, (d1, d2, d3), {})
Run Code Online (Sandbox Code Playgroud)
ron*_*man 23
这是一个单行(imports不计数:),可以很容易地推广到连接N个字典:
from itertools import chain
dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3))
Run Code Online (Sandbox Code Playgroud)
输出:
>>> 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}
Run Code Online (Sandbox Code Playgroud)
广义连接N dicts:
from itertools import chain
def dict_union(*args):
return dict(chain.from_iterable(d.iteritems() for d in args))
Run Code Online (Sandbox Code Playgroud)
from itertools import chain
dict(chain.from_iterable(d.items() for d in (d1, d2, d3)))
Run Code Online (Sandbox Code Playgroud)
和:
from itertools import chain
def dict_union(*args):
return dict(chain.from_iterable(d.items() for d in args))
Run Code Online (Sandbox Code Playgroud)
我知道,我参加这个派对有点晚了,但我希望这对某人有所帮助.