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