web-dev-qa-db-fra.com

Comment ajouter ou incrémenter un seul élément de la classe Counter Python

Un set utilise .update pour ajouter plusieurs éléments et .add pour en ajouter un seul. Pourquoi pas collections.Counter fonctionne de la même manière?

Pour incrémenter un seul élément Counter à l'aide de Counter.update, vous devez l'ajouter à une liste:

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

Puis-je faire en sorte que Counter agisse comme set (c'est-à-dire qu'il ne soit plus nécessaire de mettre la propriété dans une liste)?

Modifier: Cas d'utilisation: Imaginez un cas où vous avez des objets inconnus et où vous essayez rapidement beaucoup de choses différentes pour découvrir des choses préliminaires à leur sujet : les performances et la mise à l'échelle n'ont pas d'importance, et une compréhension rendrait la logique d'ajout et de soustraction longue.

22
scharfmn

Eh bien, vous n'avez pas vraiment besoin d'utiliser des méthodes de Counter pour compter, n'est-ce pas? Il y a un += opérateur pour cela, qui fonctionne également en conjonction avec 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
21
shx2
>>> c = collections.Counter(a=23, b=-9)

Vous pouvez ajouter un nouvel élément et définir sa valeur comme ceci:

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

Incrément:

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

Notez cependant que c['b'] = 0 ne supprime pas:

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

Pour supprimer, utilisez del:

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

Counter est une sous-classe dict

12
Vidhya G

Il existe une manière plus Pythonique de faire ce que vous voulez:

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

Il utilise un expression de générateur au lieu de coder en boucle ouverte.

Edit: Vous avez manqué votre paragraphe sans liste de compréhension. Je pense toujours que c'est la façon d'utiliser réellement Counter dans la pratique. Si vous avez trop de code à mettre dans une expression de générateur ou une compréhension de liste, il est souvent préférable de factoriser cela dans une fonction et d'appeler cela à partir d'une compréhension.

3