Python min 函数与对象列表

44 投票
4 回答
53949 浏览
提问于 2025-04-16 18:06

如何使用 key 参数来比较一组对象的某个属性,特别是在使用 min 函数的时候?

举个例子

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

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

4 个回答

16

我会通过重写 __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)>
62

这段话的意思是:

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

你需要一个函数,这个函数可以接收一个叫做SpecialNumber的东西,并且返回它里面的元素。

65

这是一个链接,点击可以查看Python的官方文档,里面有关于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

撰写回答