2014-04-12 4 views

Antwort

13

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.