如何添加或增加Python计数器类的单个项

如何添加或增加Python计数器类的单个项,python,counter,Python,Counter,set使用.update添加多个项目,使用.add添加单个项目 为什么不以同样的方式工作 要使用Counter.update增加单个计数器项,必须将其添加到列表中: from collections import Counter c = Counter() for item in something: for property in properties_of_interest: if item.has_some_property: # simplified: more

set
使用
.update
添加多个项目,使用
.add
添加单个项目

为什么不以同样的方式工作

要使用
Counter.update
增加单个
计数器
项,必须将其添加到列表中:

from collections import Counter

c = Counter()
for item in something:
    for property in properties_of_interest:
        if item.has_some_property: # simplified: more complex logic here
            c.update([item.property])
        elif item.has_some_other_property:
            c.update([item.other_property])
        # elif... etc
我是否可以让
计数器
设置
那样工作(即不必将属性放入列表)

用例:
Counter
非常好,因为它类似于
defaultdict
,在以后检查时为丢失的键提供默认零:

>>> c = Counter()
>>> c['i']
0

我发现自己经常这样做,因为我正在为各种
属性检查(特别是在笔记本中)制定逻辑。由于这方面的混乱,列表理解并不总是可取的,等等。

有一种更适合你的方式来做你想做的事情:

c = Counter(item.property for item in something if item.has_some_property)
它使用一个而不是开放的循环编码

编辑:遗漏了您的无列表理解段落。我仍然认为这是实际使用
计数器的方法。如果您有太多的代码需要放入生成器表达式或列表理解中,那么最好将其分解到函数中并从理解中调用

>>> c = collections.Counter(a=23, b=-9)
可以添加新元素并按如下方式设置其值:

>>> c['d'] = 8
>>> c
Counter({'a': 23, 'd': 8, 'b': -9})
增量:

>>> c['d'] += 1
>>> c
Counter({'a': 23, 'd': 9, 'b': -9} 
请注意,
c['b']=0
不会删除:

>>> c['b'] = 0
>>> c
Counter({'a': 23, 'd': 9, 'b': 0})
要删除,请使用
del

>>> del c['b']
>>> c
Counter({'a': 23, 'd': 9})

计数器是一个dict子类

好吧,你真的不需要使用
计数器
的方法来计数,是吗?这有一个
+=
操作符,它还与计数器一起工作

c = Counter()
for item in something:
    if item.has_some_property:
        c[item.property] += 1
    elif item.has_some_other_property:
        c[item.other_property] += 1
    elif item.has_some.third_property:
        c[item.third_property] += 1

那么你的代码和计数器有什么问题。更新吗?我必须把它放在一个假名单上。这没什么大不了的;我只是想知道no
add
背后是否有一个想法。
update
方法接受一个iterable aas参数,iterable应该是一个元素序列,而不是一个(键、值)对序列。就像我在一篇评论中说的那样,
add
甚至对你有什么帮助?你正在选择要添加什么。。。我不明白这一点-你能举个例子说明
.add
是如何工作的吗?
是否有一些属性
实际上有不同于仅获取属性本身的逻辑另请注意-使用当前的
帮助程序
,您可能会在
计数器
中获得
结果,这可能是需要的,也可能是不需要的…列表理解、生成器表达式可以做到这一点,但使用复杂的if/elif/elif/etc,它不起作用。@bahmait和你如何想象
set。add
有助于处理复杂的
if/elif/elif
等…?@bahmait:刚刚编辑过。我想,将该逻辑分解成一个单独的函数是实现这一点的python方法。我同意一个
add()
方法可能是一个很好的添加,但可能是故意的省略,将人们推到生成器风格。@JonClements如果在每次传递时除了更新计数器外还做了一系列的事情,难道不容易阅读吗?我一直在寻找
+=1
,它适用于速度慢的情况,并且将所有逻辑放在一个地方很好。这有意义吗?@bahmait-yup。。。您接受的答案肯定是可读性和可伸缩性最好的:)起初我不太清楚的是,即使您正在递增的密钥在计数器中还不存在,它也能正常工作。