web-dev-qa-db-fra.com

Façon pythonique d'itérer sur une instance collections.Counter () dans l'ordre décroissant?

Dans Python 2 (2.7, pour être plus précis), je veux parcourir une collection. Instance de compteur dans l'ordre décroissant de comptage.

>>> import collections
>>> c = collections.Counter()
>>> c['a'] = 1
>>> c['b'] = 999
>>> c
Counter({'b': 999, 'a': 1})
>>> for x in c:
        print x
a
b

Dans l'exemple ci-dessus, il apparaît que les éléments sont itérés dans l'ordre dans lequel ils ont été ajoutés à l'instance Counter.

Je voudrais parcourir la liste du plus haut au plus bas. Je vois que la représentation sous forme de chaîne de Counter fait cela, se demandant juste s'il y a une façon recommandée de le faire.

27
Inactivist

Vous pouvez parcourir la c.most_common() pour obtenir les éléments dans l'ordre souhaité. Voir aussi la documentation de Counter.most_common() .

Exemple:

>>> c = collections.Counter(a=1, b=999)
>>> c.most_common()
[('b', 999), ('a', 1)]
35
Sven Marnach

Voici l'exemple pour itérer le compteur dans les collections Python:

>>>def counterIterator(): 
 import collections
 counter = collections.Counter()
 counter.update(('u1','u1'))
 counter.update(('u2','u2'))
 counter.update(('u2','u1'))
 for ele in counter:
  print(ele,counter[ele])
>>>counterIterator()
u1 3
u2 3
4
Chandra

Votre problème a été résolu pour le simple retour de l'ordre décroissant, mais voici comment le faire de manière générique. Au cas où quelqu'un d'autre viendrait ici de Google, voici comment je devais le résoudre. Fondamentalement, ce que vous avez ci-dessus renvoie les clés du dictionnaire dans collections.Counter (). Pour obtenir les valeurs, il vous suffit de transmettre la clé au dictionnaire comme suit:

for x in c:
    key = x
    value = c[key]

J'ai eu un problème plus spécifique où j'avais le nombre de mots et je voulais filtrer les basses fréquences. L'astuce consiste ici à faire une copie des collections.Counter () ou vous obtiendrez "RuntimeError: la taille du dictionnaire a changé pendant l'itération" lorsque vous essayez de les supprimer du dictionnaire.

for Word in words.copy():
    # remove small instance words
    if words[Word] <= 3:
        del words[Word]
3
dreyco676