Extrahieren Sie die Liste der Attribute aus der Liste der Objekte in Python


78

Ich habe eine einheitliche Liste von Objekten in Python:

class myClass(object):
    def __init__(self, attr):
        self.attr = attr
        self.other = None

objs = [myClass (i) for i in range(10)]

Jetzt möchte ich eine Liste mit einem Attribut dieser Klasse extrahieren (sagen wir attr), um ihr eine Funktion zu übergeben (zum Beispiel zum Zeichnen dieser Daten).

Was ist die pythonische Art, es zu tun,

attr=[o.attr for o in objsm]

?

Leiten Sie vielleicht eine Liste ab und fügen Sie eine Methode hinzu, damit ich eine Redewendung wie verwenden kann

objs.getattribute("attr")

?


1
Siehe Duplikat stackoverflow.com/q/677656/127465 , esp. die Antwort mit operator.attrgetter
ThomasH

Antworten:


77

Sie können auch schreiben:

attr=(o.attr for o in objsm)

Auf diese Weise erhalten Sie einen Generator, der Speicher spart. Weitere Vorteile finden Sie unter Generator-Ausdrücke .


würde der Zugriff auf ein bestimmtes Eintragsergebnis einer O (n) -Operation resultieren?. Wenn der Zugriff auf index = 100 von attr [100] beispielsweise dazu führen würde, dass der Generator 100 Schritte ausführt?
Hanan Shteingart

83

attrs = [o.attr for o in objs]war der richtige Code, um eine Liste wie die von Ihnen beschriebene zu erstellen. Versuchen Sie nicht, dafür eine Unterklasse listzu bilden. Gibt es etwas, das dir an diesem Ausschnitt nicht gefallen hat?


2
Nur, dass es zu ausführlich ist und ich es oft verwenden werde, also wäre eine Verknüpfung praktisch. Die strukturierten Arrays arr ['colname'] oder recarrays arr.colname von numpy bieten bereits etwas Ähnliches, aber in diesem Fall verwende ich Objekte, die benannte Daten (und einige Funktionen) enthalten.
Franjesus

Wenn das deine Absicht ist, getOattr= lambda l,a: [getattr(i,a) for i in l] damit du getOattr(l,'id')oder kannst getOattr(l,'name') . Wenn Sie genauere benötigen, getIds= lambda l,a: [i.id for i in l]damit Sie könnengetIds(l)
user2390183
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.