如何使用min
函数的key
参数来比较对象的1属性列表?具有对象列表的Python最小函数
例
class SpecialNumber:
def __init__(self, i):
self.number = i
li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
如何使用min
函数的key
参数来比较对象的1属性列表?具有对象列表的Python最小函数
例
class SpecialNumber:
def __init__(self, i):
self.number = i
li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
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
它是:
min(li, key=lambda x: x.number)
你需要接受一个SpecialNumber
并返回其元素的功能。
我想通过覆盖__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)>
请注意,对于Python 3.0,__cmp__消失了。所以你可以在类上使用__lt__,__eq__和functools.total_ordering修饰器来使它工作(或者定义__lt__,__gt__,__le__,__ge__,__eq__,__ne__) – 2013-09-20 18:17:45
那些应该是双下划线 - 显然它是粗体降格。 .. – 2013-09-20 18:18:06
的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'类来返回数字元素? – Pwnna 2011-05-22 01:36:41
它默认返回'SpecialNumber'对象。要获得最低的元素,只需运行:'min(li,key = lambda x:x.number).number' – viraptor 2011-05-22 01:41:06