2011-05-22 47 views
19

如何使用min函数的key参数来比较对象的1属性列表?具有对象列表的Python最小函数

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

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

回答

26

它是:

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

你需要接受一个SpecialNumber并返回其元素的功能。

+0

是否可以通过返回'SpecialNumber'类来返回数字元素? – Pwnna 2011-05-22 01:36:41

+1

它默认返回'SpecialNumber'对象。要获得最低的元素,只需运行:'min(li,key = lambda x:x.number).number' – viraptor 2011-05-22 01:41:06

12

我想通过覆盖__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)> 
+3

请注意,对于Python 3.0,__cmp__消失了。所以你可以在类上使用__lt__,__eq__和functools.total_ordering修饰器来使它工作(或者定义__lt__,__gt__,__le__,__ge__,__eq__,__ne__) – 2013-09-20 18:17:45

+2

那些应该是双下划线 - 显然它是粗体降格。 .. – 2013-09-20 18:18:06

1

的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 
相关问题