假设我有三个字典
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}
假设我有三个字典
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}
最慢的方法,且不能在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
最快的方法:充分利用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
“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
或者等价地说,一个复制构造函数和两个更新操作: $ 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),特别是要避免使用方法(1)(它还需要O(N)的额外辅助内存来存储连接的项临时数据结构)。
d4 = dict(d1, **dict(d2, **d3))
比 #2 操作慢,但事实上它确实比 #2 操作慢。 - Robert Rossneyd1.items() + d2.items()
这段代码是无法正常运行的。 - Francisco**
符号:d1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}; d4 = {**d1, **d2, **d3}
。对于我来说,这比上述的#3或#4快近3倍(分别为0.228微秒每次循环,相对于#3或#4的0.661或0.595微秒)。如上所述,#1和#2在Python 3中不起作用。 - jared在Python 2中:
d4 = dict(d1.items() + d2.items() + d3.items())
在Python 3中(据说更快):
d4 = dict(d1)
d4.update(d2)
d4.update(d3)
这两个答案都来自之前的stackoverflow问题,该问题地址为此链接。
d4 = dict(d1)
,我们可以使用 d4 = copy(d1)
。 - Georg Schöllyfrom copy import copy; d4 = copy(d1)
或者 d4 = d1.copy()
。 - John Machind4 = d1.copy()
- John Carrelldict_items
对象转换为真正的list
对象。这是另一种情况,Python 3优先考虑了轻微的性能优化而不是简单易用性。 - Carl Smithupdate()
方法来构建一个包含所有项的新字典:dall = {}
dall.update(d1)
dall.update(d2)
dall.update(d3)
或者,在一个循环中:
dall = {}
for d in [d1, d2, d3]:
dall.update(d)
dall
中。这个新字典会被反复更新,以包含所有元素。dall
被更改是有意为之的。 - sth这是一个一行代码(imports
不算在内 :)),可以轻松地推广为连接 N 个字典的方法:
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))
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))
我知道我来晚了,但我希望这能帮助到某些人。
d.items()
而不是d.iteritems()
。感谢您的贡献! - fang_dejavu使用字典构造函数
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), {})