Python - Minimum d'une liste des variables d'instance
Question
Je suis nouveau à Python et j'aime vraiment la fonction min
.
>>>min([1,3,15])
0
Mais si j'ai une liste d'instances, et ils ont tous une variable number
nommée?
class Instance():
def __init__(self, number):
self.number = number
i1 = Instance(1)
i2 = Instance(3)
i3 = Instance(15)
iList = [i1,i2,i3]
Dois-je vraiment à quelque chose comme
lowestI = iList[0].number
for i in iList:
if lowestI > iList[i].number: lowestI = iList[i].number
print lowestI
Je ne peux pas utiliser min
d'une manière pythonique agréable?
La solution
La façon POO serait de mettre en œuvre __lt__
:
class Instance():
def __init__(self, number):
self.number = number
def __lt__(self, other):
return self.number < other.number
# now min(iList) just works
Une autre façon est
imin = min(iList, key=lambda x:x.number)
Des fonctions telles que sort, min, max
prennent tous un argument key
. Vous donnez une fonction qui prend un élément et retourne tout ce qui doit se tenir à ce point lorsque l'on compare ce.
Autres conseils
from operator import attrgetter
min( iList, key = attrgetter( "number" ) )
Le même argument key
travaille également avec sort
, pour mettre en œuvre l'idiome décorez-tri undecorate Pythonically.
Syntaxe du générateur:
min(i.number for i in iList)
Fonction key
:
min(iList, key=lambda i: i.number)
min(iList, key=lambda inst: inst.number)