Python - минимум списка переменных экземпляра - PullRequest
4 голосов
/ 02 сентября 2010

Я новичок в Python и мне очень нравится функция min.

>>>min([1,3,15])
0

Но что, если у меня есть список экземпляров, и у них всех есть переменная с именем number?

class Instance():
    def __init__(self, number):
        self.number = number

i1 = Instance(1)
i2 = Instance(3)
i3 = Instance(15)
iList = [i1,i2,i3]

Мне действительно нужно что-то вроде

lowestI = iList[0].number
for i in iList:
    if lowestI > iList[i].number: lowestI = iList[i].number
print lowestI

Разве я не могу использовать min в хорошем питоническом ключе?

Ответы [ 4 ]

13 голосов
/ 02 сентября 2010

ООП можно было бы реализовать __lt__:

class Instance():
    def __init__(self, number):
        self.number = number

    def __lt__(self, other):
        return self.number < other.number
        # now min(iList) just works

Другой способ -

imin = min(iList, key=lambda x:x.number)

Функции типа sort, min, max все принимают аргумент key. Вы даете функцию, которая берет элемент и возвращает то, что должно стоять для этого элемента при сравнении.

10 голосов
/ 02 сентября 2010
from operator import attrgetter
min( iList, key = attrgetter( "number" ) )

Тот же аргумент key также работает с sort для реализации идиомы decorate-sort-undecorate Python.

5 голосов
/ 02 сентября 2010

Синтаксис генератора:

min(i.number for i in iList)

key Функция:

min(iList, key=lambda i: i.number)
1 голос
/ 02 сентября 2010
min(iList, key=lambda inst: inst.number)
...