Wie Sortiere ich eine Liste der Wörterbücher, indem Sie einen Wert aus dem dictionary?
Habe ich eine Liste von Wörterbüchern und wollen, dass jedes Element sortiert werden, durch eine bestimmte Eigenschaft Werte.
Berücksichtigen das array unter,
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Wenn sortiert nach name
sind, sollten
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
was ist, wenn ich will, um durch
newlist = sortiert(list_to_be_sorted, key=lambda k: k['Alter'])
age
?newlist = sortiert(list_to_be_sorted, key=lambda k: k['Alter'])
InformationsquelleAutor |
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann es Aussehen Reiniger mit einem Schlüssel anstelle eines cmp:
oder als J. F. Sebastian und andere vorgeschlagen,
Vollständigkeit halber (wie schon in den Kommentaren von fitzgeraldsteele), fügen Sie
reverse=True
zu Sortieren und absteigend Sortierenlambda k: k['name']
könnte ersetzt werden durch die Betreiber.itemgetter('name').Was würden Sie ändern, um es in absteigender Reihenfolge Sortieren?
Sortieren absteigend: newlist = sorted(l, key=itemgetter('name'), reverse=True)
itemgetter
mehr akzeptiert als ein argument:itemgetter(1,2,3)
ist eine Funktion, die ein Tupel wieobj[1], obj[2], obj[3]
, so können Sie es verwenden, um komplexe Arten.InformationsquelleAutor Mario F
Sortieren Sie die Liste der Wörterbücher, die von key='name':
Sortieren Sie die Liste der Wörterbücher, die von key='Alter':
was ist der Vorteil von itemgetter über lambda ?
ja, nur noch die Schlüssel zurückgeben eines Tupels
key=lambda k: (k['name'], k['age'])
. (oderkey=itemgetter('name', 'age')
). Tupel istcmp
vergleichen Sie jedes element in der Reihe. es ist verdammt Brillant.key=operator.itemgetter('name','Alter')) sortiert die Liste der Wörterbücher, indem Sie die name-Taste, dann das Alter Schlüssel.
Siehe die Dokumentation für
list
und Freunde.InformationsquelleAutor
Wenn Sie möchten, um die Liste zu Sortieren, die von mehreren Tasten können Sie Folgendes tun:
Ist es eher hackish, da es stützt sich auf die Umwandlung der Werte in einem einzigen string-Darstellung für den Vergleich, aber es funktioniert wie erwartet für zahlen einschließlich negative (obwohl formatieren Sie Ihren Text entsprechend mit null Polster, wenn Sie mit zahlen)
njzk2 Kommentar war nicht sofort klar für mich, damit ich die folgenden gefunden. Können Sie nur irgendwie doppelt so njzk2 schlägt, oder mehrere Argumente übergeben zu Betreiber.itemgetter in die top-Antwort. Link: stackoverflow.com/questions/5212870/...
Keine Notwendigkeit, zu konvertieren zu einem string. Einfach nur wieder ein Tupel als Schlüssel.
Die Sortierung mehrfach, ist die einfachste, generische Lösung, die ohne hacks: stackoverflow.com/a/29849371/1805397
InformationsquelleAutor
my_list
wird nun sein, was Sie wollen.(3 Jahre später) Bearbeitet, um hinzufügen:
Den neuen
key
argument ist effizienter und sauberer. Eine bessere Antwort jetzt aussieht:...die lambda ist, IMO, das einfacher zu verstehen als
operator.itemgetter
, aber YMMV.InformationsquelleAutor pjz
'Schlüssel' verwendet wird, zu Sortieren, indem Sie einen beliebigen Wert, und 'itemgetter' legt fest, dass der Wert jedes Elements 'name' - Attribut.
InformationsquelleAutor efotinis
Ich denke, du hast gemeint:
Wäre dies genauso sortiert wie diese:
InformationsquelleAutor Bartosz Radaczyński
InformationsquelleAutor
Mit Schwartzian Transformation von Perl,
tun
gibt
Mehr auf Perl Schwartzian verwandeln
key=
für.sort
seit 2.4 ist das Jahr 2004, es hat die Schwartzian Transformation innerhalb der Sortieren code, in C; folglich ist diese Methode nur sinnvoll, auf Pythons 2.0-2.3. alle, die mehr als 12 Jahre alt.InformationsquelleAutor
Könnte man eine benutzerdefinierte Vergleichsfunktion, oder Sie können übergeben Sie eine Funktion, die berechnet eine benutzerdefinierte Sortierung-Taste. Das ist in der Regel effizienter, da der Schlüssel nur einmal berechnet pro Artikel, während der Vergleich-Funktion aufgerufen werden würde, viele Male.
Könnte man es so machen:
Aber die standard library enthält eine Allgemeine routine für erste Elemente von beliebigen Objekten:
itemgetter
. Also versuchen Sie dies:InformationsquelleAutor Owen
Implementieren Sie Ihre eigenen Vergleichs-Funktion, die den Vergleich der Wörterbücher, indem Sie die Werte der name-Schlüssel. Sehen Sortieren Mini-WIE von PythonInfo Wiki
InformationsquelleAutor Matej
Hier ist die alternative, die Allgemeine Lösung - es sortiert die Elemente des dict von Schlüsseln und Werten.
Der Vorteil - keine Notwendigkeit, geben Sie Schlüssel, und es würde immer noch funktionieren, wenn einige Tasten fehlen in einigen Wörterbüchern.
InformationsquelleAutor
Habe ich versucht, etwas wie dieses:
Funktionierte es für ganze zahlen als gut.
InformationsquelleAutor
irgendwann müssen wir mit
lower()
zum BeispielInformationsquelleAutor
Mithilfe des pandas-Paket ist eine weitere Methode, obwohl es für die Laufzeit bei großen Maßstab ist viel langsamer als die traditionellen Methoden, die von anderen:
Hier sind einige benchmark-Werte für eine winzige Liste und eine große (100k+) Liste von dicts:
Du hast ganz Recht, das war wirklich ein versehen meinerseits. Ich nicht mehr empfehlen es für große Fälle! Ich habe bearbeitet die Antwort einfach, dass es als eine Möglichkeit, die noch zur Debatte.
InformationsquelleAutor
Können Sagen, ich h ' V ein Wörterbuch D mit den Elementen unten. Zu Sortieren, benutzen Sie einfach als entscheidendes argument in so sortiert, dass die benutzerdefinierte Funktion übergeben, wie unten
https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions
InformationsquelleAutor
Hier ist meine Antwort auf eine ähnliche Frage auf das Sortieren von mehreren Spalten. Es funktioniert auch für die entarteten Fall, wo die Anzahl der Spalten ist nur eine.
InformationsquelleAutor
Wenn Sie brauchen nicht die original -
list
vondictionaries
, Sie könnte es ändern in-place mitsort()
- Methode mit einer benutzerdefinierten Taste Funktion.Key-Funktion:
Den
list
sortiert werden:Sortierung in-place:
Wenn Sie die ursprünglichen
list
rufen Sie diesorted()
- Funktion übergeben Sie dielist
und die Taste Funktion, dann weisen Sie das zurückgegebene sortiertlist
um eine neue variable:Drucken
data_one
undnew_data
.InformationsquelleAutor
Können Sie itemgetter ,wenn Sie wollen, betrachten Sie die performance. itemgetter in der Regel läuft etwas schneller, als lambda.
InformationsquelleAutor
Verwenden, können Sie den folgenden code
InformationsquelleAutor