问题描述
当字典理解中的键相同时,我希望将它们的值相加。 例如,
>>> 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循环来做到这一点,但是有速记吗?
1楼
没有速记版本,因为您的理解力将需要跟踪无法执行的当前状态。 如您所说,答案是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
方法更加简洁时,这是不值得的。
2楼
计算总和最快的方法之一是使用defaultdict
自初始化字典:
from collections import defaultdict
new = defaultdict(int)
for k, v in old.items():
new[k**2] += v