0

做类似的事情很常见

min(my_list, key=lambda x: abs( x - 5))

foo(my_list, key=lambda x,y: abs(x-y)) 

假设 my_list 是一些MyClass对象的列表,我想知道我是否可以在 MyClass 中定义 key 函数并在调用 min 或 foo 时使用它。

编辑

我应该更清楚..

有没有办法使用MyClass方法而不是在这里使用 lambda 来实现以下目标?

foo(my_list, key=lambda x,y: abs(x.value-y.value))
4

3 回答 3

2
>>> class MyClass:
...     def __init__(self, value):
...         self.value = value
...     def __repr__(self):
...         return 'MyClass({0.value})'.format(self)
...     def key_function(self):
...         return -self.value
... 
>>> my_list = [MyClass(2), MyClass(1), MyClass(3)]
>>> my_list
[MyClass(2), MyClass(1), MyClass(3)]
>>> sorted(my_list, key=lambda mc: mc.value)
[MyClass(1), MyClass(2), MyClass(3)]
>>> min(my_list, key=lambda mc: mc.value) # by attribute
MyClass(1)
>>> sorted(my_list, key=lambda mc: mc.key_function()) # by method call
[MyClass(3), MyClass(2), MyClass(1)]
>>> sorted(my_list, key=MyClass.key_function) # using unbound method
[MyClass(3), MyClass(2), MyClass(1)]

更新

>>> class MyClass:
...     def __init__(self, value):
...         self.value = value
...     def __repr__(self):
...         return 'MyClass({0.value})'.format(self)
...     def delta(self, other):
...         return abs(self.value - other.value)
... 
>>> def foo(a_list, key):
...     return [key(a, b) for a, b in zip(a_list, a_list[1:])]
... 
>>> my_list = [MyClass(1), MyClass(10), MyClass(100)]
>>> print foo(my_list, key=lambda x, y: abs(x.value - y.value)) # Using lambda
[9, 90]
>>> print foo(my_list, key=MyClass.delta) # Using unbound method
[9, 90]
于 2013-11-08T07:12:50.303 回答
1
min(my_list, key=operator.methodcaller('keymethod'))
于 2013-11-08T07:14:41.863 回答
1

是的。这是一个示例,其中MyClass == str

L = 'a', 'B', 'c'
print(min(L)) # -> B
print(min(L, key=str.lower)) # -> a
于 2013-11-08T07:20:53.300 回答