当词典理解中的键是相同的时候,我希望将它们的值加起来。例如,
>>> 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
使用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
方法更加清洁时不值得。
计算总和的最快方法之一是使用defaultdict
- 一个自我初始化字典:
from collections import defaultdict
new = defaultdict(int)
for k, v in old.items():
new[k**2] += v