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メソッドを使用して以下を達成する方法はありますか?

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 に答える