Wie sortiere ich den Zähler nach Wert? - Python

144

Gibt es eine pythonische Möglichkeit, den Zähler nach Wert zu sortieren, abgesehen vom Listenverständnis des umgekehrten Listenverständnisses? Wenn ja, ist es schneller als dies:

>>> 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)
Alvas
quelle

Antworten:

250

Verwenden Sie die Counter.most_common()Methode , um die Elemente für Sie zu sortieren :

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

Dies geschieht auf möglichst effiziente Weise. Wenn Sie anstelle aller Werte nach einem Top N fragen, heapqwird a anstelle einer geraden Sortierung verwendet:

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

Außerhalb von Zählern kann die Sortierung immer basierend auf einer keyFunktion angepasst werden. .sort()und sorted()beide nehmen callable, mit dem Sie einen Wert angeben können, nach dem die Eingabesequenz sortiert werden soll. sorted(x, key=x.get, reverse=True)würde Ihnen die gleiche Sortierung geben wie x.most_common(), aber nur die Schlüssel zurückgeben, zum Beispiel:

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

oder Sie können nur nach den angegebenen (key, value)Paaren sortieren :

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

Weitere Informationen finden Sie im Python-Sortier-Howto .

Martijn Pieters
quelle
30

Eine ziemlich nette Ergänzung zur Antwort von @MartijnPieters ist das Zurückholen eines nach Vorkommen sortierten Wörterbuchs, da Collections.most_commonnur ein Tupel zurückgegeben wird. Ich kopple dies oft mit einer JSON-Ausgabe für handliche Protokolldateien:

from collections import Counter, OrderedDict

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

Mit der Ausgabe:

OrderedDict([('c', 7), ('a', 5), ('b', 3)])
{
  "c": 7, 
  "a": 5, 
  "b": 3
}
Süchtig
quelle
10

Ja:

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

Verwenden des sortierten Schlüsselwortschlüssels und einer Lambda-Funktion:

>>> 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)]

Dies funktioniert für alle Wörterbücher. Hat Counterjedoch eine spezielle Funktion, die Ihnen bereits die sortierten Elemente gibt (von am häufigsten bis am seltensten). Es heißt 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)]

Sie können auch angeben, wie viele Elemente Sie sehen möchten:

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]
Inbar Rose
quelle
Eine andere Möglichkeit, die Sortierung umzukehren, besteht darin, die Schlüsselfunktion auflamda i: -i[1]
Steinar Lima
4

Allgemeiner sortiert, wobei das keySchlüsselwort die Sortiermethode definiert, minus bevor der numerische Typ absteigend anzeigt:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]
Alex Seam
quelle
2
Das keySchlüsselwort definiert die Sortiermethode, minus bevor der numerische Typ absteigend anzeigt
Alex Seam