Ich habe eine Counter
in Python 3.3.x
, die ich sortieren möchte.
Ich weiß, ich kann .most_common(x)
verwenden, aber ich möchte die Schlüssel bei gleichem Wert alphabetisch sortiert werden.
Gibt es eine Möglichkeit, dies zu tun? Setzen Sie diese Art von "Tie-Breaker"?Sortierzähler Sammlung in Python mit Nebenbedingung (Tie Breaker)
Antwort
collections.Counter
ist eigentlich ein Wörterbuch und sie beruhen auf Hashing-Technik, so dass wir wirklich nicht auf sie zugreifen können. Da ein Zugriff nach Auftrag nicht möglich ist, kommt das Sortieren eines Wörterbuchs nicht in Frage. Aber Sie können das in eine Liste von Tupeln konvertieren, die Schlüssel und Wert entsprechen, und dann sortieren. Zum Beispiel
print(Counter('abracadabra').most_common())
# [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
print(sorted(Counter('abracadabra').most_common(), key=lambda x: (-x[1], x[0])))
# [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]
Wir machen das sorted
sortieren die (key, value)
von most_common
angegebenen Daten. Wir möchten sicherstellen, dass die Artikel absteigend nach value
und aufsteigend nach key
sortiert werden müssen. Also, wir benutzen hier einen kleinen Trick. sorted
ruft die Funktion auf, die wir übergeben haben, als Wert für key
Parameter für jedes Element in der zu sortierenden Sequenz. Der von dieser Funktion zurückgegebene Wert wird verwendet, um dieses bestimmte Element beim Vergleich mit anderen Elementen darzustellen. In unserem Fall geht die key
Funktion wie diese
lambda x: (-x[1], x[0])
Hier x
alle Elemente erhalten werden schließlich und es tauscht die Position der ersten und zweiten Elemente und negiert die tatsächliche Anzahl Teil. Da die sorted
standardmäßig die Daten in aufsteigender Reihenfolge sortiert, machen wir die größte Zahl zur kleinsten und umgekehrt. Zum Beispiel
[2, 3, 1]
Wenn Sie sie in aufsteigender Reihenfolge sortiert werden sollen, wird die sorted
halten das kleinste Element am Anfang und am nächsten kleinsten in der zweiten Position und so weiter, bis es das größte Element erreicht. In unserem Fall wird es [1, 2, 3]
. Um die Elemente in absteigender Reihenfolge zu sortieren, stellen wir ihre negierten Werte als tatsächliche Zahlen dar.
sorted([2, 3, 1], key=lambda x: -x)
Wenn nun sorted
Picks 2
, die key
Funktion ruft den Wert zu erhalten, verwendet werden, und es wird -2
und den gleichen Weg zurück, wird 1
-1
sein, 3
-3
sein wird. Es wird das Element mit dem kleinsten am Anfang platzieren. Da wir -3
für 3 bekommen, wird 3 am Anfang sein, 2
wird daneben sein und 1 wird danach sein. Also wird das Ergebnis [3, 2, 1]
.
Wir wenden die gleiche Technik an, um basierend auf zwei Elementen in einem Element zu sortieren. Wir sortieren zuerst basierend auf den Zählwerten, indem wir absteigend sortieren und wenn sie die Sortierung basierend auf dem Schlüssel aufsteigend sortieren.