Ich habe eine Liste von Wörterbüchern und möchte, dass jedes Element nach bestimmten Eigenschaftswerten sortiert wird.
Berücksichtigen Sie das folgende Array:
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Wenn sortiert nach name
, sollte werden
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
[{'name':'Bart', 'age':10, 'note':3},{'name':'Homer','age':10,'note':2},{'name':'Vasile','age':20,'note':3}]
Und zu verwenden:from operator import itemgetter newlist = sorted(old_list, key=itemgetter(-'note','name')
BEARBEITEN: Getestet, und es funktioniert, aber ich weiß nicht, wie man DESC notiert und ASC benennt.Antworten:
Mit einem Schlüssel anstelle eines cmp sieht es möglicherweise sauberer aus:
oder wie JFSebastian und andere vorgeschlagen haben,
Der Vollständigkeit halber (wie in den Kommentaren von fitzgeraldsteele ausgeführt)
reverse=True
zur absteigenden Sortierung hinzufügenquelle
itemgetter(i)
woi
der Index des Tupelelement ist zu sortieren.itemgetter
akzeptiert mehr als ein Argument:itemgetter(1,2,3)
ist eine Funktion, die ein Tupel wie zurückgibtobj[1], obj[2], obj[3]
, sodass Sie damit komplexe Sortierungen durchführen können.So sortieren Sie die Liste der Wörterbücher nach key = 'name':
So sortieren Sie die Liste der Wörterbücher nach key = 'age':
quelle
key=lambda k: (k['name'], k['age'])
. (oderkey=itemgetter('name', 'age')
). Tupelcmp
vergleichen nacheinander jedes Element. es ist verdammt brillant.key
Argument fürlist.sort()
nicht beschrieben. Irgendeine Idee, wo man das findet?list
und Freunde.my_list
wird jetzt sein, was Sie wollen.(3 Jahre später) Bearbeitet, um hinzuzufügen:
Das neue
key
Argument ist effizienter und ordentlicher. Eine bessere Antwort sieht jetzt so aus:... das Lambda ist, IMO, leichter zu verstehen als
operator.itemgetter
, aber YMMV.quelle
Wenn Sie die Liste nach mehreren Schlüsseln sortieren möchten, haben Sie folgende Möglichkeiten:
Es ist ziemlich hackisch, da es darauf beruht, die Werte zum Vergleich in eine einzelne Zeichenfolgendarstellung umzuwandeln, aber es funktioniert wie erwartet für Zahlen, einschließlich negativer Zeichen (obwohl Sie Ihre Zeichenfolge mit Null-Auffüllungen entsprechend formatieren müssen, wenn Sie Zahlen verwenden).
quelle
'key' wird verwendet, um nach einem beliebigen Wert zu sortieren, und 'itemgetter' setzt diesen Wert auf das Attribut 'name' jedes Elements.
quelle
quelle
Ich denke du hast gemeint:
Dies würde wie folgt sortiert werden:
quelle
Sie können eine benutzerdefinierte Vergleichsfunktion verwenden oder eine Funktion übergeben, die einen benutzerdefinierten Sortierschlüssel berechnet. Dies ist normalerweise effizienter, da der Schlüssel nur einmal pro Element berechnet wird, während die Vergleichsfunktion mehrmals aufgerufen wird.
Sie könnten es so machen:
Die Standardbibliothek enthält jedoch eine generische Routine zum Abrufen von Elementen beliebiger Objekte :
itemgetter
. Versuchen Sie dies stattdessen:quelle
Verwenden der Schwartzschen Transformation von Perl,
tun
gibt
Mehr zur Perl-Schwartz-Transformation
quelle
key=
für.sort
seit 2.4, das Jahr 2004 ist, ist es der Schwartzian innerhalb des Sortier Code umwandeln, in C; Daher ist diese Methode nur für Pythons 2.0-2.3 nützlich. Alle sind älter als 12 Jahre.Sie müssen Ihre eigene Vergleichsfunktion implementieren, die die Wörterbücher anhand der Werte der Namensschlüssel vergleicht. Siehe Sortieren von Mini-HOW TO aus dem PythonInfo-Wiki
quelle
irgendwann müssen wir
lower()
zum Beispiel verwendenquelle
Hier ist die alternative allgemeine Lösung: Sie sortiert Elemente des Diktats nach Schlüsseln und Werten. Der Vorteil davon - keine Notwendigkeit, Schlüssel anzugeben, und es würde immer noch funktionieren, wenn einige Schlüssel in einigen Wörterbüchern fehlen.
quelle
Die Verwendung des Pandas-Pakets ist eine andere Methode, obwohl die Laufzeit im großen Maßstab viel langsamer ist als die traditionelleren Methoden, die von anderen vorgeschlagen wurden:
Hier sind einige Benchmark-Werte für eine winzige Liste und eine große Liste (über 100.000) von Diktaten:
quelle
Wenn Sie das Original
list
von nicht benötigendictionaries
, können Sie essort()
mithilfe einer benutzerdefinierten Tastenfunktion direkt mit der Methode ändern .Schlüsselfunktion:
Die
list
zu sortierenden:Sortieren an Ort und Stelle:
Wenn Sie das Original benötigen
list
, rufen Sie diesorted()
Funktion auf, die eslist
und die Schlüsselfunktion übergibt, und weisen Sie die zurückgegebene Sortierunglist
einer neuen Variablen zu:Drucken
data_one
undnew_data
.quelle
Angenommen, ich habe ein Wörterbuch
D
mit Elementen unten. Verwenden Sie zum Sortieren einfach das Schlüsselargument in sortiert, um die benutzerdefinierte Funktion wie folgt zu übergeben:Überprüfen Sie dies heraus.
quelle
Ich war ein großer Fan von Filter mit Lambda, aber es ist nicht die beste Option, wenn man die Komplexität der Zeit berücksichtigt
Erste Wahl
Zweite Option
Schneller Vergleich der Ausführungszeiten
quelle
Wenn die Leistung ein Problem darstellt, würde ich
operator.itemgetter
stattdessen verwenden,lambda
da integrierte Funktionen schneller ausgeführt werden als handgefertigte Funktionen. Dieitemgetter
Funktion scheint ungefähr 20% schneller zu sein alslambda
nach meinen Tests.Von https://wiki.python.org/moin/PythonSpeed :
Hier ist ein Vergleich Geschwindigkeit des Sortierens mit
lambda
vsitemgetter
.Beide Techniken sortieren die Liste in derselben Reihenfolge (überprüft durch Ausführung der endgültigen Anweisung im Codeblock), aber eine ist etwas schneller.
quelle
Sie können den folgenden Code verwenden
quelle