Wie sortiere ich eine Liste von Wörterbüchern nach einem Wert des Wörterbuchs in Python?

Lesezeit: 4 Minuten

Wie sortiere ich eine Liste von Wörterbüchern nach dem Wert eines bestimmten Schlüssels? Gegeben:

[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]

Wenn sortiert nach namees sollte werden:

[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]

  • Die Antwort lesen und weiterschauen Operator.itemgetter. Kann ich im selben Prozess nach mehreren Werten sortieren (zum Beispiel haben wir [{'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') EDIT: Getestet und es funktioniert, aber ich weiß nicht, wie ich DESC notiere und ASC benenne.

    – Claudiu

    21. Mai 2020 um 7:13 Uhr


Benutzeravatar von Mario F
Mario F

Der sorted() Funktion dauert a key= Parameter

newlist = sorted(list_to_be_sorted, key=lambda d: d['name']) 

Alternativ können Sie verwenden operator.itemgetter anstatt die Funktion selbst zu definieren

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

Der Vollständigkeit halber hinzufügen reverse=True in absteigender Reihenfolge sortieren

newlist = sorted(list_to_be_sorted, key=itemgetter('name'), reverse=True)

  • Die Verwendung von Schlüsseln ist nicht nur sauberer, sondern auch effizienter.

    – jfs

    16. September 2008 um 15:03

  • Der schnellste Weg wäre das Hinzufügen einer newlist.reverse()-Anweisung. Ansonsten können Sie einen Vergleich wie cmp=lambda x,y: – cmp(x) definieren[‘name’],y[‘name’]).

    – Mario F

    13. Okt. 2009 um 7:14

  • Wenn der Sortierwert eine Zahl ist, könnte man sagen: lambda k: (k[‘age’] * -1), um eine umgekehrte Sortierung zu erhalten

    – Philluminati

    20. November 2009 um 15:16 Uhr

  • Dies gilt auch für eine Liste von Tupeln, sofern Sie diese verwenden itemgetter(i) Wo i ist der Index des Tupelelements, nach dem sortiert werden soll.

    – Radikand

    11. Juli 2012 um 23:14

  • itemgetter akzeptiert mehr als ein Argument: itemgetter(1,2,3) ist eine Funktion, die ein Tupel zurückgibt obj[1], obj[2], obj[3]sodass Sie damit komplexe Sortierungen durchführen können.

    – Bakuriu

    7. September 2012 um 17:59

import operator

So sortieren Sie die Liste der Wörterbücher nach key=’name’:

list_of_dicts.sort(key=operator.itemgetter('name'))

So sortieren Sie die Liste der Wörterbücher nach key=’age’:

list_of_dicts.sort(key=operator.itemgetter('age'))

  • Wie auch immer, Name und Alter zu kombinieren? (wie in SQL ORDER BY name,age ?)

    – Monojohnny

    17. Februar 2010 um 13:10 Uhr


  • @monojohnny: Ja, der Schlüssel soll einfach ein Tupel zurückgeben, key=lambda k: (k['name'], k['age']). (oder key=itemgetter('name', 'age')). Tupel cmp vergleicht nacheinander jedes Element. Es ist verdammt brillant.

    – Claudiu

    4. September 2013 um 22:21


  • In der Dokumentation (docs.python.org/2/tutorial/datastructures.html) die Wahl key Argument für list.sort() wird nicht beschrieben. Irgendeine Idee, wo man das finden kann?

    – TTT

    21. Februar 2014 um 15:21


  • @TTT: Siehe Bibliotheksdokumentation für list und Freunde.

    – Kevin

    19. Februar 2015 um 14:56

Benutzeravatar von pjz
pjz

my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

my_list.sort(lambda x,y : cmp(x['name'], y['name']))

my_list wird jetzt das sein, was Sie wollen.

Oder besser:

Seit Python 2.4 gibt es eine key Argument ist sowohl effizienter als auch übersichtlicher:

my_list = sorted(my_list, key=lambda k: k['name'])

…das Lambda ist meiner Meinung nach leichter zu verstehen als operator.itemgetteraber Ihr Kilometerstand kann variieren.

  • Was könnte getan werden, wenn der Schlüssel unbekannt ist und sich ständig ändert? Ich meine eine Liste von Diktaten mit nur einem Schlüssel und Wert, aber der Schlüssel und der Wert konnten nicht definiert werden, da sie sich ständig ändern.

    – Sam

    1. Dezember 2020 um 14:51 Uhr

  • Ich bräuchte mehr Beispiele zum Anschauen. Versuchen Sie, eine mögliche Lösung auf dem Codereview-Stackexchange einzureichen und zu fragen, ob es einen besseren Weg gibt.

    – pjz

    30. Dezember 2020 um 1:02

  • @Sam, wenn Sie nach dem Wert des einzelnen Schlüssels im Diktat sortieren möchten, auch wenn Sie den Schlüssel nicht kennen, können Sie dies tun key=lambda k: list(k.values())[0]

    – pjz

    10. März 2021 um 6:38

Wenn Sie die Liste nach mehreren Schlüsseln sortieren möchten, können Sie Folgendes tun:

my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

Es ist ziemlich hackig, da es auf der Konvertierung der Werte in eine einzelne Zeichenfolgendarstellung zum Vergleich beruht, aber es funktioniert wie erwartet für Zahlen, einschließlich negativer Einsen (obwohl Sie Ihre Zeichenfolge entsprechend mit Nullauffüllungen formatieren müssen, wenn Sie Zahlen verwenden).

a = [{'name':'Homer', 'age':39}, ...]

# This changes the list a
a.sort(key=lambda k : k['name'])

# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name']) 

Benutzeravatar von efotinis
efotinis

import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

„key“ wird zum Sortieren nach einem beliebigen Wert verwendet und „itemgetter“ setzt diesen Wert auf das Attribut „name“ jedes Elements.

Benutzer-Avatar von Bartosz Radaczyński
Bartosz Radaczyński

Ich vermute, du meintest:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Das würde wie folgt sortiert werden:

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

1450660cookie-checkWie sortiere ich eine Liste von Wörterbüchern nach einem Wert des Wörterbuchs in Python?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy