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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top