Pythonでは、次の関数があります。
def is_a_nice_element(element, parameter):
#do something
return True or False
ここで、この関数を述語としてリストをフィルタリングし、固定パラメーターを指定します。Pythonにはitertools.ifilter関数がありますが、パラメーターを渡す方法がわかりません。これは可能ですか?そうでない場合、どうすればこの問題を解決できますか?
functools.partialよりもはるかに好きですlambda
。
itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
で包むlambda
:
itertools.ifilter(lambda e: is_a_nice_element(e, 42), iterable)
42はあなたの余分な議論、またはあなたが望む他のものです。
解決策は非常lambda
にfunctools.partial
正しく、あなたの質問に直接答えますが、実際には理想的な解決策ではないと思います。
filter
/ itertools.ifilter
/ map
/itertools.imap
を無名関数で使用すると、ジェネレーター式やリスト内包表記を使用する場合よりも、ほぼ常に明確ではなくなります。たとえば、この場合、ジェネレータ式を記述します
(item for item in iterable if is_a_nice_element(item, constant))
を使用する代わりにifilter
。この場合、ifilter
ソリューションはまだかなり読みやすいですが、多くの場合、適切な関数を定義するために多くのトラブルを経験しようとしても、操作を実行するだけの価値はありません。
を使用している場合ifilter
、パラメータは定数である必要があります。その場合、デフォルトの引数を使用できますparameter=something
。パラメータを変更する場合は、別の方法を使用して2項述語を取得する必要があります。
すでにリストを持っている場合は、組み込みのフィルターifilter
に比べて少しやり過ぎです。
達成したいことを説明することは、より具体的な答えを出すのに役立ちます。