有没有办法覆盖列表项的类中list.max()和list.sort()的“键”功能?

时间:2011-09-27 07:32:42

标签: python

我有一个超类的多个子类,用于存储instance_of_a_class.value中的内容,并覆盖__cmp__()以提供合理的==<>等。比较。

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

min(list_of_instances_of_class, key=lambda _: _.value)max(list_of_instances_of_class, key=lambda _: _.value)以及偶尔sorted(...

是否有一个要在类中重写的函数,这样我就不必为每个对所述函数的调用指定key函数,或者我是否需要子类list并覆盖{ {1}},maxmin方法?

2 个答案:

答案 0 :(得分:6)

只需实施__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()

答案 1 :(得分:1)

不直接,不。最简单的方法可能是定义您使用的特定函数来代替min / max / sorted。 e.g。

from functools import partial
min_myclass = partial(min, key = operator.attrgetter('value'))
max_myclass = partial(max, key = operator.attrgetter('value'))
...
min_myclass(list_of_instances_of_myclass)