Come ordinare il contatore per valore? - pitone


145

Oltre a comprendere la comprensione della lista invertita, esiste un modo pitonico di ordinare il contatore per valore? In tal caso, è più veloce di questo:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x)
['a', 'b', 'c']
>>> sorted(x.items())
[('a', 5), ('b', 3), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()])]
[('b', 3), ('a', 5), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()], reverse=True)]
[('c', 7), ('a', 5), ('b', 3)

Risposte:


251

Usa il Counter.most_common()metodo , ordinerà gli articoli per te :

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]

Lo farà nel modo più efficiente possibile; se chiedi una N più alta invece di tutti i valori, heapqviene utilizzato a anziché un ordinamento semplice:

>>> x.most_common(1)
[('c', 7)]

Al di fuori dei contatori, l'ordinamento può sempre essere regolato in base a una keyfunzione; .sort()ed sorted()entrambi prendono il callable che ti permette di specificare un valore su cui ordinare la sequenza di input; sorted(x, key=x.get, reverse=True)ti darebbe lo stesso ordinamento di x.most_common(), ma restituirebbe solo le chiavi, ad esempio:

>>> sorted(x, key=x.get, reverse=True)
['c', 'a', 'b']

oppure puoi ordinare solo sul valore dato alle (key, value)coppie:

>>> sorted(x.items(), key=lambda pair: pair[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

Vedi il howto di ordinamento Python per maggiori informazioni.


30

Un'aggiunta piuttosto piacevole alla risposta di @MartijnPieters è quella di recuperare un dizionario ordinato per occorrenza poiché Collections.most_commonrestituisce solo una tupla. Spesso lo associo a un output json per file di registro utili:

from collections import Counter, OrderedDict

x = Counter({'a':5, 'b':3, 'c':7})
y = OrderedDict(x.most_common())

Con l'output:

OrderedDict([('c', 7), ('a', 5), ('b', 3)])
{
  "c": 7, 
  "a": 5, 
  "b": 3
}

10

Sì:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})

Utilizzando la chiave della parola chiave ordinata e una funzione lambda:

>>> sorted(x.items(), key=lambda i: i[1])
[('b', 3), ('a', 5), ('c', 7)]
>>> sorted(x.items(), key=lambda i: i[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

Funziona con tutti i dizionari. Tuttavia Counterha una funzione speciale che ti dà già gli articoli ordinati (dal più frequente al meno frequente). Si chiama most_common():

>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]
>>> list(reversed(x.most_common()))  # in order of least to most
[('b', 3), ('a', 5), ('c', 7)]

Puoi anche specificare quanti elementi vuoi vedere:

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]

Un altro modo per invertire l'ordinamento è impostare la funzione chiave sulamda i: -i[1]
Steinar Lima

4

Ordinati più in generale, dove la keyparola chiave definisce il metodo di ordinamento, meno prima che il tipo numerico indichi la decrescente:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]

2
La keyparola chiave definisce il metodo di ordinamento, meno prima che il tipo numerico indichi decrescente
Alex Seam il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.