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我今天思维迟钝。你为什么不把答案贴出来?我很好奇。@DYZ
counts=Counter();对于k,旧.items()中的v:counts[k**2]+=v
我将使用
计数器或
默认dict
,具体取决于我已经导入的:)只需使用for循环即可。或者一个
collections.Counter
object.@juanpa.arrivillaga计数器不会工作,是吗?@DYZ它的工作方式与默认dict答案相同,不是吗?@juanpa.arrivillaga我今天思维迟钝。你为什么不把答案贴出来?我很好奇。@DYZ
counts=Counter();对于k,旧.items()中的v:counts[k**2]+=v
我将使用
计数器或
默认dict
,具体取决于我已经导入的:)