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}
的更新。