求和而不是覆盖字典理解中的值

问题描述 投票:0回答:2

当词典理解中的键是相同的时候,我希望将它们的值加起来。例如,

>>> dct = {-1: 1, 0: 2, 1: 3}
>>> {k**2: v for k, v in dct.items()}
{1: 3, 0: 2}

但是,在这种情况下我想得到的是{1: 4, 0: 2},因为1和-1的平方都是1,而1 + 3 = 4。

很明显,我可以用for循环来做,但是有速记吗?

python python-3.x dictionary merge dictionary-comprehension
2个回答
4
投票

没有速记版本,因为你的理解需要跟踪当前不可行的状态。就像你说的那样,答案是for循环:

old = {-1: 1, 0: 2, 1:3}
new = {}
for k, v in old.items():
    new[k**2] = new.get(k**2, 0) + v

使用dict.get方法的技巧我在Python文档中看到过。它做同样的事情:

if k**2 in new:
   new[k**2] += v
else:
   new[k**2] = v

但是这种变化使用get方法,该方法返回默认值0,该默认值0将被添加到将要分配的值(当密钥不存在时)。由于它是0,并且值是添加的数字,因此0无效。相比之下,如果您需要获得产品,则使用1作为默认值,因为从0开始将意味着您永远不会增加该值。

另外,上面所示的后者,更详细的方法,每个周期两次评估k**2,这耗尽了计算量。为了使它1使用计算将需要另一行代码,在我看来,当get方法更加清洁时不值得。


2
投票

计算总和的最快方法之一是使用defaultdict - 一个自我初始化字典:

from collections import defaultdict
new = defaultdict(int)
for k, v in old.items():
    new[k**2] += v
© www.soinside.com 2019 - 2024. All rights reserved.