Immer der max-Wert der Attribute aus einer Liste von Objekten
Habe ich diese Liste von Objekten, welche ein x-und ein y-parameter (und noch einige andere Sachen).
path.nodes = (
<GSNode x=535.0 y=0.0 GSLINE GSSHARP>,
<GSNode x=634.0 y=0.0 GSLINE GSSHARP>,
<GSNode x=377.0 y=706.0 GSLINE GSSHARP>,
<GSNode x=279.0 y=706.0 GSLINE GSSHARP>,
<GSNode x=10.0 y=0.0 GSLINE GSSHARP>,
<GSNode x=110.0 y=0.0 GSLINE GSSHARP>,
<GSNode x=189.0 y=216.0 GSLINE GSSHARP>,
<GSNode x=458.0 y=216.0 GSLINE GSSHARP>
)
Brauche ich, um das max-y dieser Liste. Obwohl, ich versuchte dies:
print max(path.nodes, key=y)
Und ich bekomme diese Fehlermeldung:
NameError: name 'y' is not defined
Ich bin ein bisschen neu auf Python und die docs mir keine Ahnung. Ich glaube, ich bin falsch mit dem Schlüsselwort, denn wenn Sie eine Iteration durch die Knoten wie dieser:
for node in path.nodes:
print node.y
Ich werde die Werte von y.
Könnte jemand mir dafür eine Erklärung?
InformationsquelleAutor PDXIII | 2012-10-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erhalten nur den maximalen Wert und nicht das gesamte Objekt, können Sie einen generator-Ausdruck:
key=lambda x: x.y
Weg, genau wie die anderen. Aber dies ist das, was Sie wirklich können, rufen Sie pythonic! +1Gibt es eine integrierte Hilfe bei diesem Fall.
Alternativ:
Edit: Aber Mark Byers' Antwort ist ganz Pythonic.
Es gibt einen wichtigen Unterschied bei der Verwendung der "Pythonic" style#1 versus lambda-style#2:
versus
Wenn Sie genau hinschauen, können Sie sehen, dass Stil#1 gibt den maximalen Wert für das Attribut "y", während style#2 liefert die "Knoten", die maximale Attribut "y". Diese beiden sind nicht die gleichen und code-Nutzung ist wichtig, wenn Sie möchten, Durchlaufen Sie die Attribut-Werte oder die Iteration über die Objekte, die besagt, dass das Attribut.
Beispiel:
Nun:
y
ist nicht als variable definiert; es ist ein Attribut der einzelnenGSNode
Objekte; Sie können nicht es verwenden, wie ein name auf seiner eigenen.Zugriff auf die einzelnen Attribute, die Sie verwenden können, so etwas wie
key=lambda x: x.y
oderattrgetter()
von deroperator
Modul.Wenn
y
ist eine Eigenschaft, Attribut dann brauchen Sie nicht einmal zu importierenoperator.attrgetter
. Sie könnenfget
Methode statt:Diese zurück
Node
Instanz, von wo aus man die maxy
Wert ist nurmy_node.y