Python 将collections.Counter()与具有负整数的Django queryset一起使用

Python 将collections.Counter()与具有负整数的Django queryset一起使用,python,django,python-3.x,Python,Django,Python 3.x,作为使用Counter()解决的问题的后续,我遇到了一个似乎很容易解决的新问题——只是我无法让它工作 我试图使用Counter()对一系列dict项求和,如果和为正整数,则该项有效;如果和为负整数,则返回空元素。我在解释计数器()本质上是用来计数而不是求和时,找到了正确的答案 我可以重新创建这个示例并使其工作,但是使用django queryset,当与Counter()方法结合使用时,会生成一个更复杂的字典,如下所示 totals = { 'sumthing_a': Counter({

作为使用
Counter()
解决的问题的后续,我遇到了一个似乎很容易解决的新问题——只是我无法让它工作

我试图使用
Counter()
对一系列dict项求和,如果和为正整数,则该项有效;如果和为负整数,则返回空元素。我在解释
计数器()
本质上是用来计数而不是求和时,找到了正确的答案

我可以重新创建这个示例并使其工作,但是使用django queryset,当与
Counter()
方法结合使用时,会生成一个更复杂的字典,如下所示

totals = {
    'sumthing_a': Counter({'total': 48000}), 
    'sumthing_b': Counter({'total': 39050}), 
    'sumthing_c': Counter({'total': 8950}), 
    'sumthing_d': Counter({'total': 10000}), 
    'sumthing_e': Counter({'total': 17200}), 
    'sumthing_f': Counter({'total': 17750}), 
    'sumthing_g': Counter({'total': 30450}),
    }
我试过以下几种:

totals.update({'sumthing_e': Counter({'total': 300})})
将原来的17200替换为300,而不是添加它们

我也试过:

totals['sumthing_e'].update({'sumthing_e': Counter({'total': 300})})
它抛出:
不支持的+:“Counter”和“int”的操作数类型

.update()
的文档说明:

元素从一个iterable中计数或从另一个映射中添加 (或柜台)。与dict.update()类似,但添加计数而不是替换 他们。此外,iterable应该是一个元素序列,而不是 一系列(键、值)对

还有一份文件说明:

对于c[key]+=1这样的就地操作,值类型只需要 支持加减法。分数、浮点数和小数 将起作用,并支持负值。这也是事实 对于update()和subtract(),允许 输入和输出

这让我相信,如果代码正确的话,我想做的是可能的。最终结果应该是具有负数的能力-例如:

totals = {
    'sumthing_a': Counter({'total': 48000}), 
    'sumthing_b': Counter({'total': -40503}), 
    'sumthing_c': Counter({'total': 8950}), 
    'sumthing_d': Counter({'total': 10000}), 
    'sumthing_e': Counter({'total': -58462}), 
    'sumthing_f': Counter({'total': 17750}), 
    'sumthing_g': Counter({'total': 30450}),
    }

查看
totals['sumthing\u e']的类型

In [13]: type(totals['sumthing_e'])
Out[13]: collections.Counter
您可以尝试通过公共字典
{'sumthing_e':Counter({'total':300})}

所以,如果您想像工作示例中那样重置计数器,您应该执行以下操作:

totals['sumthing_e'] = Counter({'total': 300})
In [15]: totals['sumthing_e'].update(Counter({'total': 300}))

In [16]: totals['sumthing_e']
Out[16]: Counter({'total': 600})

In [17]: totals['sumthing_e'].update(Counter({'total': 300}))

In [18]: totals['sumthing_e']
Out[18]: Counter({'total': 900})

In [19]: totals['sumthing_e'].update(Counter({'total': -200}))

In [20]: totals['sumthing_e']
Out[20]: Counter({'total': 700})
但如果您想更新计数器,则应执行以下操作:

totals['sumthing_e'] = Counter({'total': 300})
In [15]: totals['sumthing_e'].update(Counter({'total': 300}))

In [16]: totals['sumthing_e']
Out[16]: Counter({'total': 600})

In [17]: totals['sumthing_e'].update(Counter({'total': 300}))

In [18]: totals['sumthing_e']
Out[18]: Counter({'total': 900})

In [19]: totals['sumthing_e'].update(Counter({'total': -200}))

In [20]: totals['sumthing_e']
Out[20]: Counter({'total': 700})

扩展@BearBrown的正确答案:

原始词典条目采用以下格式:

'sumthing_a': Counter({'total': 48000})
.update(Counter())
只接受计数器字典——这一部分

{'total': 48000}
因此,为了提取字典,需要以下代码

dict(totals.get('sumthing_a'))

然后返回到@BearBrown的答案中的
.update()
方法。

按照广告的方式工作-也在一个更复杂的模型中工作-因此这个概念得以延续。一条补充的评论-我最初的问题是如何获得显示此解决方案工作的
{'total':-500}
的更新。