python – 有没有办法在列表项的类中覆盖list.max()和list.sort()的“key”函数?

我有一个超类的多个子类,它们在instance_of_a_class.value中存储一些东西,我重写__cmp __()以提供合理的==,<,>比较.

但是,我在我的代码中有多个位置

min(list_of_instances_of_class,key = lambda _:_. value)或max(list_of_instances_of_class,key = lambda _:_. value)和偶尔排序(…

是否有一个函数要在类中重写,这样我就不必为每个对所述函数的调用指定键函数,或者我是否需要子类列表并覆盖max,min和sorted方法?

最佳答案 只需实现__lt__:

class Obj(object):
    def __init__(self, value):
        self.value = value
    def __lt__(self, other):
        return self.value < other.value
    def __repr__(self):
        return 'Obj(%r)' % self.value

obj_list = [Obj(2), Obj(1), Obj(4), Obj(3)]

print max(obj_list)
print min(obj_list)
print sorted(obj_list)

不推荐使用__cmp__,并且您提到的所有函数仅使用__lt__而不使用其他比较.

如果由于某种原因你真的不能用这种方式比较,你可以这样做:

from operator import attrgetter
from functools import partial

valget = attrgetter('value')

maxval = partial(max, key=valget)
minval = partial(max, key=valget)
sortedval = partial(sorted, key=valget)
sortval = partial(list.sort, key=valget)

你把它们称为maxval(obj_list)而不是max(obj_list)等,而sortval(obj_list)就地排序而不是obj_list.sort()

点赞