8

map()とリスト内包表記はほぼ同等です。

map(function, list1)
[function(i) for i in list1]

使用したい関数がメソッドの場合はどうなるでしょうか?

[i.function() for i in list1]
map(.function, list1) # error!
map(run_method(function), list1) # error!

でこの種の操作を実行するにはどうすればよいmapですか?

4

2 に答える 2

16

あなたが使用するだろうoperator.methodcaller()

from operator import methodcaller

map(methodcaller('function'), list1)

methodcaller()呼び出されたメソッドに渡される追加の引数を受け入れます。methodcaller('foo', 'bar', spam='eggs')(object)と同等ですobject.foo('bar', spam='eggs')

のすべてのオブジェクトlist1が同じ型またはその型のサブクラスであり、呼び出したいメソッドが引数を取らない場合は、バインドされていないメソッドをmap呼び出す関数として に渡すことができます。たとえば、リスト内のすべての文字列を小文字にするには、次を使用できます。

map(str.lower, list_of_strings)

ここstr.lowerで、型のバインドされていないメソッドstrです。

リスト内包表記は実際にはヒアと同等ではないことに注意してmap()ください。は1 つのmap()ループしか実行できず、完全に C で実行されます。複数の反復可能な引数があり、Python 3 ではそれ自体が反復子です。map()zip()map()

一方、リスト内包表記は複数の (ネストされた) ループを実行し、フィルタリングを追加できます。左側の式は、ネストされたリスト内包表記を含む任意の有効な Python 式にすることができます。

于 2014-02-16T16:47:16.687 に答える