Python 字典理解中的求和而不是重写值
当字典中的键相同时,我希望将它们的值相加。比如说,Python 字典理解中的求和而不是重写值,python,python-3.x,dictionary,merge,dictionary-comprehension,Python,Python 3.x,Dictionary,Merge,Dictionary Comprehension,当字典中的键相同时,我希望将它们的值相加。比如说, >>> 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 = {-
>>> 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
方法如此干净的情况下,这不值得花时间 没有速记版本,因为你的理解需要跟踪当前的状态,这是不可行的。正如您所说,答案是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
计算总和的最快方法之一是使用
defaultdict
——一种自初始化字典:
from collections import defaultdict
new = defaultdict(int)
for k, v in old.items():
new[k**2] += v
只需使用for循环。或者一个
collections.Counter
object.@juanpa.arrivillaga计数器不会工作,是吗?@DYZ它的工作方式与默认dict答案相同,不是吗?@juanpa.arrivillaga我今天思维迟钝。你为什么不把答案贴出来?我很好奇。@DYZcounts=Counter();对于k,旧.items()中的v:counts[k**2]+=v
我将使用计数器或默认dict
,具体取决于我已经导入的:)只需使用for循环即可。或者一个collections.Counter
object.@juanpa.arrivillaga计数器不会工作,是吗?@DYZ它的工作方式与默认dict答案相同,不是吗?@juanpa.arrivillaga我今天思维迟钝。你为什么不把答案贴出来?我很好奇。@DYZcounts=Counter();对于k,旧.items()中的v:counts[k**2]+=v
我将使用计数器或默认dict
,具体取决于我已经导入的:)