Python - Mindestens eine Liste der Instanzvariablen
Frage
Ich bin neu in Python, und ich liebe wirklich die min
Funktion.
>>>min([1,3,15])
0
Aber was ist, wenn ich eine Liste von Instanzen haben, und sie alle eine Variable mit dem Namen number
haben?
class Instance():
def __init__(self, number):
self.number = number
i1 = Instance(1)
i2 = Instance(3)
i3 = Instance(15)
iList = [i1,i2,i3]
Muss ich wirklich so etwas wie
lowestI = iList[0].number
for i in iList:
if lowestI > iList[i].number: lowestI = iList[i].number
print lowestI
Kann ich nicht min
in einer netten Art und Weise pythonic benutzen?
Lösung
Der OOP Weg wäre __lt__
zu implementieren:
class Instance():
def __init__(self, number):
self.number = number
def __lt__(self, other):
return self.number < other.number
# now min(iList) just works
Eine andere Möglichkeit ist
imin = min(iList, key=lambda x:x.number)
Funktionen wie sort, min, max
nehmen alle ein key
Argument. Sie geben eine Funktion, die ein Element aus und kehrt nimmt, was auch immer für diesen Titel stehen sollte, wenn es verglichen wird.
Andere Tipps
from operator import attrgetter
min( iList, key = attrgetter( "number" ) )
Das gleiche key
Argument funktioniert auch mit sort
, für die Umsetzung des deco-Art-undecorate Idioms Pythonically.
Generator Syntax:
min(i.number for i in iList)
key
Funktion:
min(iList, key=lambda i: i.number)
min(iList, key=lambda inst: inst.number)