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

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

A set использует .update добавить несколько элементов, и add добавить один. Почему не Counter работать так же? Могу ли я заставить его действовать аналогично (т. е. исключить необходимость помещать свойство в список)?

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

3 ответов


Ну, вам действительно не нужно использовать методы 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

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


есть более подходящие для Python способ сделать то, что вы хотите:

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

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

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