Seite 1 von 1

Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 11:34
von mutetella
Hallo,

ich möchte eine Liste 'entries' mit Entry()-Exemplaren nach einem bestimmten Attribut sortieren. Folgendes funktioniert, wenn die Exemplare eine Methode 'get_title()' besitzen:

Code: Alles auswählen

sorted(entries, key=Entry.get_title)
Ich würde aber etwas in der Art, allerdings ohne den Umweg über ein lambda, bevorzugen:

Code: Alles auswählen

sorted(entries, key=lambda e: getattr(e, 'title'))
Was könnte ich machen?

Gruß
mutetella

Re: Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 11:50
von frabron
Bei sorted kannst du doch auch eine Comparison Funktion angeben, die das Vergleichen übernimmt. Oder, das musst du aber testen, du implementierst __lt__, __gt__ usw. auf dem Objekt

Re: Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 11:53
von EyDu

Re: Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 12:00
von frabron

Code: Alles auswählen

class Itr(object):
    def __init__(self, val):
        self.cmp = val
        
    def __gt__(self, other):
        return self.cmp > other.cmp
    def __eq__(self, other):
        return self.cmp == other.cmp
    def __lt__(self, other):
        return self.cmp < other.cmp
        

foo = sorted([Itr(3), Itr(1), Itr(10), Itr(4)])
print [a.cmp for a in foo]
funktioniert soweit bei mir. K.A., ob dir das hilft ...

Re: Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 12:50
von mutetella
@frabron:
Danke für Dein Beispiel! Ich hab' mir auch EyDu's Vorschlag mit operator.attrgetter angesehen und finde, dass eine Lösung damit einfacher und laut Doku auch schneller ist.
Zudem müsste ich mit Deiner Lösung das Sortierkriterium, das nicht immer gleich ist, im Exemplar festlegen was IMHO nicht so schön ist als selbiges 'von außen' zu bestimmen.

Gruß
mutetella

Re: Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 13:32
von frabron
EyDu und mich trennen wohl ca. Äonen an Programmiererfahrung :D

Ich wusste einfach nicht, ob mein Vorschlag mit den Vergleichsoperatoren auf dem Objekt funktioniert, deshalb hab ich ihn halt flott ausprobiert und das Resultat für die Nachwelt erhalten :) Nicht, dass ich es nicht geahnt hätte, aber man weiss ja nie :D

Re: Liste nach Attributen sortieren...

Verfasst: Freitag 4. März 2011, 14:10
von EyDu
@frabron: Du kannst sogar noch ein wenig vereinfachen:

Code: Alles auswählen

>>> class Spam(object):
...     def __init__(self, eggs):
...         self.eggs = eggs
...     def __cmp__(self, other):
...         return cmp(self.eggs, other.eggs)
...     def __repr__(self):
...         return "%s(%r)" % (self.__class__.__name__, self.eggs)
... 
>>> sorted([Spam(42), Spam(23), Spam(30), Spam(7)])
[Spam(7), Spam(23), Spam(30), Spam(42)]