在Django查询集中使用collections.Counter处理负整数的问题
解决Counter字典条目累加(含负数)的问题
我来帮你理清楚问题所在,以及正确的实现方式:
首先,你混淆了普通字典的update方法和Counter的update方法,而且错误地嵌套了Counter对象,导致了问题。
正确的累加写法
要实现某个Counter项里total值的累加(包括负数),直接针对目标Counter对象调用update(),传入要累加的键值对即可:
# 给sumthing_e的total加300 totals['sumthing_e'].update({'total': 300}) # 给sumthing_b的total减去79553(得到39050 - 79553 = -40503) totals['sumthing_b'].update({'total': -79553})
这样操作后,你就能得到包含负数值的Counter结果,完全符合你的需求。
为什么之前的写法不对?
第一种写法的问题:
totals.update({'sumthing_e': Counter({'total': 300})})这里的
totals是普通字典,不是Counter。字典的update()方法的作用是替换键对应的value,而不是累加。所以这会直接把sumthing_e原来的Counter替换成新的Counter,而不是累加数值。第二种写法的问题:
totals['sumthing_e'].update({'sumthing_e': Counter({'total': 300})})你给Counter的
update()传入了一个键为sumthing_e、值为Counter的字典。Counter的update()方法会把值当成可迭代对象去计数,这就导致了类型错误——它试图把Counter和int做加法,自然会抛出unsupported operand type(s) for +: 'Counter' and 'int'。
额外技巧:用Counter加法实现累加
如果你喜欢更直观的加法操作,也可以直接构造一个调整用的Counter,然后和目标Counter做加法(注意这会返回新的Counter,如果你要原地修改还是用update()):
# 构造要调整的数值(从17200到-58462需要减去75662) adjustment = Counter({'total': -75662}) # 原地修改目标Counter totals['sumthing_e'] += adjustment
Counter确实支持负数计数,只要你针对正确的对象(每个value对应的Counter)进行操作,就能实现你想要的正负数值累加效果。
内容的提问来源于stack exchange,提问作者Bill Armstrong
相关产品推荐
相关产品推荐

