当前位置: 代码迷 >> python >> 在字典理解中求和而不是覆盖值
  详细解决方案

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

热度:93   发布时间:2023-06-19 09:23:47.0

当字典理解中的键相同时,我希望将它们的值相加。 例如,

>>> 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循环来做到这一点,但是有速记吗?

没有速记版本,因为您的理解力将需要跟踪无法执行的当前状态。 如您所说,答案是for循环:

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

我在Python文档的某处看到了使用dict.get方法的技巧。 它与以下功能相同:

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

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

此外,上面显示的后者(更详细)方法每个周期对k**2两次评估,这会用尽计算量。 要使其使用1计算,将需要另一行代码,在我看来,当get方法更加简洁时,这是不值得的。

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

from collections import defaultdict
new = defaultdict(int)
for k, v in old.items():
    new[k**2] += v
  相关解决方案