Как добавить или увеличить один элемент класса счетчика Python

set использует .update для добавления нескольких элементов и .add для добавления одного. Почему не collections.Counter работает так же?

Чтобы увеличить один элемент Counter с помощью Counter.update, вы должны добавить его в список:

c = Counter()

for item in something:
    for property in properties_of_interest:
        if item.has_some_property: # pseudocode: more complex logic here
            c.update([item.property])
        elif item.has_some_other_property:
            c.update([item.other_property])
        # elif... etc

Могу ли я заставить Counter действовать как set (т.е. избавиться от необходимости помещать свойство в список)?

Edit: Use Case: представьте себе случай, когда у вас есть несколько неизвестных объектов, и вы быстро пытаетесь найти разные предварительные сведения о них: производительность и масштабирование не имеют значения, а понимание может привести к сложению и вычитанию логики. кропотливый.

Ответы

Ответ 1

Ну, вам не нужно использовать методы Counter, чтобы считать, не так ли? Для этого существует оператор +=, который также работает совместно с Counter.

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

Ответ 2

>>> c = collections.Counter(a=23, b=-9)

Вы можете добавить новый элемент и установить его значение следующим образом:

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

Increment:

>>> 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

Ответ 3

Существует более Pythonic способ делать то, что вы хотите:

c = Counter(item.property for item in something if item.has_some_property)

Он использует выражение генератора вместо открытого кодирования цикла.

Изменить: пропустил ваш абзац без списка. Я все еще думаю, что это способ фактически использовать Counter на практике. Если у вас слишком много кода для выражения выражения генератора или списка, часто лучше включить это в функцию и вызвать это из понимания.