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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top