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


Ich habe eine Liste von Wörterbüchern und möchte, dass diese nach einem Wert dieses Wörterbuchs sortiert werden.

Dies

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

sortiert nach Namen, sollte werden

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

1340
2017-09-16 14:39


Ursprung


Antworten:


Es kann sauberer aussehen, wenn Sie einen Schlüssel anstelle eines cmp verwenden:

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

oder wie J.F.Sebastian und andere vorgeschlagen haben,

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

Zur Vollständigkeit (wie in Kommentaren von fitzgeraldsteele angegeben), fügen Sie hinzu reverse=True absteigend sortieren

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

1818
2017-09-16 15:18



import operator

Um die Liste der Wörterbücher nach Schlüssel = 'Name' zu sortieren:

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

Um die Liste der Wörterbücher nach Schlüssel = 'Alter' zu sortieren:

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

109
2017-09-16 14:39



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 hackisch, da es für das Vergleichen der Werte in eine einzelne Zeichenfolgendarstellung konvertiert, aber es funktioniert wie erwartet für Zahlen einschließlich negative (obwohl Sie Ihre Zeichenfolge mit Nullauffüllung formatieren müssen, wenn Sie Nummern verwenden)


39
2017-09-16 14:43



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 sein, was du willst.

(3 Jahre später) Bearbeitet um hinzuzufügen:

Das neue key Argument ist effizienter und sauberer. Eine bessere Antwort sieht jetzt so aus:

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

... das Lambda ist, IMO, leichter zu verstehen als operator.itemgetter, aber YMMV.


27
2017-09-16 14:36



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

'key' wird verwendet, um nach einem beliebigen Wert zu sortieren, und 'itemgetter' setzt diesen Wert auf das Attribut 'name' jedes Elements.


20
2017-09-16 14:52



Ich denke du hast gemeint:

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

Dies würde so sortiert sein:

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

14
2017-09-16 14:31



Sie können eine benutzerdefinierte Vergleichsfunktion verwenden oder eine Funktion übergeben, die einen benutzerdefinierten Sortierschlüssel berechnet. Das ist normalerweise effizienter, da der Schlüssel nur einmal pro Element berechnet wird, während die Vergleichsfunktion viel öfter aufgerufen wird.

Du könntest es so machen:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

Die Standardbibliothek enthält jedoch eine generische Routine zum Abrufen von Objekten beliebiger Objekte: itemgetter. Versuchen Sie es stattdessen:

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

12



Mit Schwartzscher Transformation von Perl,

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

machen

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

gibt

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

Mehr dazu Perl Schwartzian transformiert

In der Informatik ist die Schwartzsche Transformation eine Perl-Programmierung   Idiom verwendet, um die Effizienz der Sortierung einer Liste von Elementen zu verbessern. Dies   Idiom eignet sich für vergleichsbasierte Sortierung, wenn die Reihenfolge ist   tatsächlich basierend auf der Reihenfolge einer bestimmten Eigenschaft (der Schlüssel) der   Elemente, wo die Berechnung dieser Eigenschaft ist eine intensive Operation, die   sollte eine minimale Anzahl von Malen durchgeführt werden. Der Schwartzsche   Transform ist insofern bemerkenswert, als es benannte temporäre Arrays nicht verwendet.


12