2016-12-01 3 views
2

Могу ли я добавить/увеличить отдельные элементы на счетчик?collections.Counter - могу ли я добавить/увеличить отдельные элементы на счетчик?

Я получаю каждый элемент один за другим из потока синтаксического анализа xml, поэтому мой счетчик здесь всегда будет основан на 1-на-1.

ОК, я знаю, что могу это сделать:

from collections import Counter 
counter = Counter("abaa") 

print ("counter:", counter) #('counter:', Counter({'a': 3, 'b': 1})) 

#and I can do this as well... 
def track_data(counter, data): 
    counter.update(Counter(data)) 

#let's say I am in a function that receives data one by one. 
one_element_of_incoming_data = "a" 
track_data(counter, one_element_of_incoming_data) 
print ("counter:", counter) #('counter:', Counter({'a': 4, 'b': 1})) 

но то, что я действительно хочу сделать это, чтобы увеличить без создания нового счетчика:

counter.increment(one_element_of_incoming_data) 

и увидеть мой счет за «а «Поднимитесь на один. Это не похоже, что это в Counter API, я что-то упускаю?

Да, я знаю, что я мог бы использовать defaultdict и увеличивать себя, но я ожидал, что эта возможность выйдет из Counter.

+1

Счетчик - это всего лишь подкласс dict. Все, что вы можете сделать с помощью dict, вы можете делать с Counter. –

+0

На самом деле, он работает как 'defaultdict (int)' –

+1

90% времени, когда вы можете просто попробовать, что вы * надеетесь * будет работать на Python, и он будет работать. –

ответ

4

Sure:

from collections import Counter 

counter = Counter() 
for s in 'abcdefga': 
    counter[s] += 1 

Таким образом, Counter работает как defaultdict(int). Тем не менее, он также имеет некоторые удобные методы, поскольку он предназначен для работы со множеством вещей (например, вы можете добавить два Counter s вместе, у него есть более удобный конструктор и т. Д.).

+0

Им важно помнить, что счетчик в значительной степени является «defaultdict (int)» со всеми этими прекрасными методами, специально предназначенными для подсчета и обработки счетчиков. –

+2

@MoinuddinQuadri - Правильно, но тогда '.update' может не работать так, как вы этого хотите, и вы не получите все дополнительные возможности, которые' Counter' дает вам бесплатно (например, возможность добавлять/вычитать другие 'Counter's). – mgilson

+0

гений и самый * Pythonic *. Я знал, что мой подход не хватает чего-то. Я попробовал 'counter ['a'] = 1' для увеличения, пропустил необходимость' + = '. Хотелось, чтобы документ охватил его. –