Python min函数,带有一个对象列表

Pwn*_*nna 26 python

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

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

li = [SpecialNumber(1), SpecialNumber(3), SpecialNumber(2)]
Run Code Online (Sandbox Code Playgroud)

ber*_*nie 45

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

from operator import attrgetter
min_num = min(li,key=attrgetter('number'))
Run Code Online (Sandbox Code Playgroud)

交互式会话示例:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • `operator.attrgetter` 函数是否比使用 lambda 函数更快? (3认同)
  • @RicksupportsMonica是的,它更快/sf/ask/189357311/ (2认同)

vir*_*tor 34

它的:

min(li, key=lambda x: x.number)
Run Code Online (Sandbox Code Playgroud)

你需要一个接受a SpecialNumber并返回其元素的函数.

  • 它默认返回“SpecialNumber”对象。要获取最低元素,只需运行:`min(li, key=lambda x: x.number).number` (2认同)

Dae*_*yth 13

我是通过压倒来做到的 __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)>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,对于Python 3.0,__cmp__消失了.所以你可以在类上使用__lt __,__ eq__和functools.total_ordering装饰器来使它工作(或者定义__lt __,__ gt__,__ le __,__ ge__,__ eq__,__ ne__) (3认同)
  • 那些应该是双重下划线 - 显然它是大胆的降价... (2认同)