Как добавить или увеличить один элемент класса счетчика 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
на практике. Если у вас слишком много кода для выражения выражения генератора или списка, часто лучше включить это в функцию и вызвать это из понимания.