带有对象列表的Python min函数

带有对象列表的Python min函数,python,Python,如何使用min函数的key参数来比较对象的1属性列表 范例 class SpecialNumber: def __init__(self, i): self.number = i li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)] 它是: 您需要一个函数,该函数接受一个特殊编号,并返回其元素。 交互式会话示例: >>> li = [SpecialNumber(1), SpecialN

如何使用
min
函数的
key
参数来比较对象的1属性列表

范例

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

li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
它是:

您需要一个函数,该函数接受一个
特殊编号
,并返回其元素。

交互式会话示例:

>>> 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
我会通过覆盖

类特殊编号:
定义初始化(self,i):
self.number=i
定义报告(自我):
返回“”%self.number
定义cmp(自身、其他):
返回cmp(自身编号、其他编号)
li=[特殊编号(1)、特殊编号(3)、特殊编号(2)]
印民(李)

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

是否可以通过返回
SpecialNumber
类而不返回number元素?默认情况下,它确实返回
SpecialNumber
对象。要获得最低的元素,只需运行:
min(li,key=lambda x:x.number)。因此,您可以在类上使用lt、eq和functools.total_排序修饰符使其工作(或定义lt、gt、le、ge、eq、ne)这些应该是双下划线-显然是加粗的标记…是
运算符。attrgetter
函数比使用lambda函数快吗?@RicksupportsMonica是的,它更快
>>> 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
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)>
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