Python - 实例变量列表的最小值

Diz*_*Doo 4 python list min

我是Python的新手,我非常喜欢这个min功能.

>>>min([1,3,15])
0
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个实例列表,并且它们都有一个名为number?的变量怎么办?

class Instance():
    def __init__(self, number):
        self.number = number

i1 = Instance(1)
i2 = Instance(3)
i3 = Instance(15)
iList = [i1,i2,i3]
Run Code Online (Sandbox Code Playgroud)

我真的需要这样的东西吗?

lowestI = iList[0].number
for i in iList:
    if lowestI > iList[i].number: lowestI = iList[i].number
print lowestI
Run Code Online (Sandbox Code Playgroud)

我不能min以一种漂亮的pythonic方式使用吗?

Joc*_*zel 13

OOP的方式是实现__lt__:

class Instance():
    def __init__(self, number):
        self.number = number

    def __lt__(self, other):
        return self.number < other.number
        # now min(iList) just works
Run Code Online (Sandbox Code Playgroud)

另一种方式是

imin = min(iList, key=lambda x:x.number)

sort, min, max所有人一样的功能都是key争论的 你给出一个函数,它接受一个项目,并在比较它时返回该项目应该代表的东西.


Kat*_*iel 10

from operator import attrgetter
min( iList, key = attrgetter( "number" ) )
Run Code Online (Sandbox Code Playgroud)

同样的key论证也适用于sort,用Python来实现decorate-sort-undecorate习语.

  • attrgetter和itemgetter rock - 使用它们可以消除很多lambda函数.它们比lambda更快,恕我直言更容易阅读. (4认同)

Joh*_*ica 5

生成器语法:

min(i.number for i in iList)
Run Code Online (Sandbox Code Playgroud)

key 功能:

min(iList, key=lambda i: i.number)
Run Code Online (Sandbox Code Playgroud)