web-dev-qa-db-fra.com

Python Counter keys () renvoie des valeurs

J'ai un compteur déjà commandé par nombre d'occurrences.

counterlist = Counter({'they': 203, 'would': 138, 'your': 134,...}).

Mais quand je fais counterlist.keys() la liste de retour est:

['wirespe', 'four', 'accus',...]

au lieu de

['they', 'would', 'your',...].

Pourquoi?

8
user3005486

Counter()

Un compteur est une sous-classe dict pour compter les objets lavables. Il s'agit d'une collection non ordonnée où les éléments sont stockés sous forme de clés de dictionnaire et leurs nombres sont stockés sous forme de valeurs de dictionnaire.

est un dict non ordonné, il ne conserve donc pas l'ordre dans lequel vous les avez ajoutés au dict. Si vous voulez les garder en ordre, vous devrez utiliser un OrderedDict()

Si vous voulez une OrderedCounter() alors vous pouvez faire ce que je tire de ici qui a une explication quant à pourquoi cela fonctionne.

from collections import *

class OrderedCounter(Counter, OrderedDict):
    pass

counterlist = OrderedCounter({'would': 203, 'they': 138, 'your': 134})

print counterlist.keys()
12
SirParselot

Pendant que vous saisissez les valeurs dans un dictionnaire dans un ordre particulier, un dict ne conserve aucun ordre. .keys() sur un dict retourne dans aucun ordre particulier. Il y a un OrderedDict qui conserve l'ordre, mais je ne sais pas comment cela interagit avec Counter.

ÉDITER:

Vous voudrez peut-être utiliser Counter.most_common () . Cela renverra une liste de tuples qui seront en ordre.

2
Tim Tisdall

Une autre solution sans créer de classe supplémentaire consiste à prendre l'ensemble des éléments dont vous disposez et à les trier en fonction des clés comptées. Le code ci-dessous est basé sur @ user3005486:

import collections

#if this is your list    
list_to_be_sorted = ['they', 'would', 'they', ...]
#then counterlist = {'would': 203, 'they': 138, 'your': 134}
counterlist = collections.Counter(list_to_be_sorted)
#if you sort this list ascendingly you get ['would', 'would', ..., 'they', 'they', ...etc.]
sorted_words = sorted(counterlist, key: lambda x:-counterlist[x])
distinct_words_from_list = set(list_to_be_sorted)
sorted_distinct_list = sorted(distinct_words_from_list, key: lambda x:-counterlist[x])
#then sorted_distinct_list = ['would', 'they', 'your']
1
Bahaa