相关疑难解决方法(0)

如何在单个表达式中合并两个词典?

我有两个Python字典,我想编写一个返回这两个字典的表达式,合并.update()如果它返回结果而不是就地修改dict,那么该方法将是我需要的.

>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = x.update(y)
>>> print(z)
None
>>> x
{'a': 1, 'b': 10, 'c': 11}
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得最终合并的词典z,不是x吗?

(要清楚的是,最后一次胜利的冲突处理dict.update()也是我正在寻找的.)

python merge dictionary

4349
推荐指数
41
解决办法
168万
查看次数

为什么列表上的总和(有时)比itertools.chain更快?

我在这里回答了几个问题,用它来"压扁"列表列表:

>>> l = [[1,2,3],[4,5,6],[7,8,9]]
>>> sum(l,[])
Run Code Online (Sandbox Code Playgroud)

它工作正常,产量:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

虽然我被告知sum操作员做a = a + b的不是那么高效itertools.chain

我计划的问题是"为什么它可以在字符串上阻止字符串",但我在我的机器上做了一个快速的基准测试比较sumitertools.chain.from_iterable相同的数据:

import itertools,timeit

print(timeit.timeit("sum(l,[])",setup='l = [[1,2,3],[4,5,6],[7,8,9]]'))
print(timeit.timeit("list(itertools.chain.from_iterable(l))",setup='l = [[1,2,3],[4,5,6],[7,8,9]]'))
Run Code Online (Sandbox Code Playgroud)

我这样做了几次,我总是得到与下面相同的数字:

0.7155522836070246
0.9883352857722025
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,chain- sum在我的答案的几条评论中,每个人推荐列表 - 速度要慢得多.

在循环中迭代时仍然很有趣,for因为它实际上并不创建列表,但是在创建列表时,sum获胜.

那么当预期结果是什么时我们应该放弃itertools.chain并使用?sumlist

编辑:感谢一些评论,我通过增加列表数量进行了另一项测试

s = 'l = [[4,5,6] for _ in range(20)]'
print(timeit.timeit("sum(l,[])",setup=s))
print(timeit.timeit("list(itertools.chain.from_iterable(l))",setup=s))
Run Code Online (Sandbox Code Playgroud)

现在我反其道而行之:

6.479897810702537
3.793455760814343
Run Code Online (Sandbox Code Playgroud)

python list

5
推荐指数
2
解决办法
680
查看次数

标签 统计

python ×2

dictionary ×1

list ×1

merge ×1