Подтвердить что ты не робот

Функция Python min со списком объектов

Как использовать аргумент key для функции min для сравнения списка атрибутов объектов 1?

Пример

class SpecialNumber:
    def __init__(self, i):
        self.number = i

li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
4b9b3361

Ответ 1

http://docs.python.org/library/operator.html#operator.attrgetter

from operator import attrgetter
min_num = min(li,key=attrgetter('number'))

Пример интерактивного сеанса:

>>> li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
>>> [i.number for i in li]
[1, 3, 2]
>>> min_num = min(li,key=attrgetter('number'))
>>> print min_num.number
1

Ответ 2

Это:

min(li, key=lambda x: x.number)

вам нужна функция, которая принимает SpecialNumber и возвращает свой элемент.

Ответ 3

Я бы сделал это, переопределив __cmp__

class SpecialNumber:
    def __init__(self, i):
        self.number = i

    def __repr__(self):
        return '<SpecialNumber(%d)>' % self.number

    def __cmp__(self, other):
        return cmp(self.number, other.number)

li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
print min(li) # <SpecialNumber(1)>

Ответ 4

версия getattr быстрее

import random
from operator import attrgetter

class Test:
    def __init__(self):
        self.a = random.random()

t = [Test() for i in range(10000)]

%timeit min(t, key=lambda x: x.a)
1000 loops, best of 3: 790 µs per loop

%timeit min(t,key=attrgetter('a'))
1000 loops, best of 3: 582 µs per loop