1229 Stimmen

Wie sortiere ich eine Liste von Objekten basierend auf einem Attribut der Objekte?

Ich habe eine Liste von Python-Objekten, die ich nach einem bestimmten Attribut jedes Objekts sortieren möchte:

[Tag(name="toe", count=10), Tag(name="leg", count=2), ...]

Wie sortiere ich die Liste nach .count absteigend?

7 Stimmen

Sortieranleitung für diejenigen, die mehr Informationen über das Sortieren in Python suchen.

1 Stimmen

Abgesehen von operator.attrgetter ('attribut_name') können Sie auch Funktoren als Schlüssel verwenden, wie z.B. object_list.sort(key=my_sorting_functor ('my_key')), wobei die Implementierung absichtlich ausgelassen wird.

17voto

muhuk Punkte 15179

Es sieht sehr nach einer Liste von Django ORM-Modellinstanzen aus.

Warum sortieren Sie sie nicht auf diese Weise auf Anfrage:

ut = Tag.objects.order_by('-count')

0 Stimmen

Es ist, aber unter Verwendung von Django-Tagging, also habe ich ein eingebautes verwendet, um ein Tag-Set nach Verwendung für einen bestimmten Abfrage-Set abzurufen, wie folgt: Tag.objects.usage_for_queryset(QuerySet, counts=True)

15voto

Georgy Punkte 9744

Wenn das Attribut, nach dem Sie sortieren möchten, eine Eigenschaft ist, können Sie das Importieren von operator.attrgetter vermeiden und stattdessen die Methode fget der Eigenschaft verwenden.

Zum Beispiel könnten wir für eine Klasse Kreis mit einer Eigenschaft radius eine Liste von Kreisen nach Radien sortieren:

result = sorted(circles, key=Circle.radius.fget)

Dies ist nicht das bekannteste Feature, aber es spart mir oft eine Zeile beim Import.

0 Stimmen

Ich war überrascht, dass ich nicht einfach Circle.radius setzen konnte. Ich verstehe nicht, warum es nicht funktioniert. Vielen Dank für den Hinweis, fget zu verwenden. Ich mag es nicht, Lambdas zu definieren, wenn etwas anderes die Arbeit erledigen kann, und ich mag es nicht, die Namen von Attributen als Zeichenketten an attrgetter zu übergeben, es fühlt sich einfach falsch an, für mich.

1 Stimmen

@PeterWood Der Schlüssel muss (1) aufrufbar sein, (2) ein Argument akzeptieren und (3) einen sortierbaren Wert zurückgeben. sortiert nimmt jedes Element, das sortiert werden soll, gibt jedes davon nacheinander an den Schlüssel weiter und sortiert die zurückgegebenen Werte als Stellvertreter für die Elemente selbst. Circle.radius funktioniert nicht, weil property-Objekte selbst nicht aufrufbar sind. Aber sie haben ein Attribut namens fget, das dies tut.

0 Stimmen

@ibonyun danke, das hilft wirklich dabei zu klären, warum

13voto

rob Punkte 35132

Fügen Sie den Objektklasse reiche Vergleichsoperatoren hinzu und verwenden Sie dann die sort() Methode der Liste.
Siehe reicher Vergleich in Python.


Aktualisierung: Obwohl diese Methode funktionieren würde, denke ich, dass die Lösung von Triptych besser für Ihren Fall geeignet ist, weil einfacher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X