2

Pythonでは、次の関数があります。

def is_a_nice_element(element, parameter):
    #do something
    return True or False

ここで、この関数を述語としてリストをフィルタリングし、固定パラメーターを指定します。Pythonにはitertools.ifilter関数がありますが、パラメーターを渡す方法がわかりません。これは可能ですか?そうでない場合、どうすればこの問題を解決できますか?

4

4 に答える 4

5

functools.partialよりもはるかに好きですlambda

itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
于 2010-03-20T14:36:23.993 に答える
3

で包むlambda

itertools.ifilter(lambda e: is_a_nice_element(e, 42), iterable)

42はあなたの余分な議論、またはあなたが望む他のものです。

于 2010-03-20T13:17:13.150 に答える
1

解決策は非常lambdafunctools.partial正しく、あなたの質問に直接答えますが、実際には理想的な解決策ではないと思います。

filter/ itertools.ifilter/ map/itertools.imapを無名関数で使用すると、ジェネレーター式やリスト内包表記を使用する場合よりも、ほぼ常に明確ではなくなります。たとえば、この場合、ジェネレータ式を記述します

(item for item in iterable if is_a_nice_element(item, constant))

を使用する代わりにifilter。この場合、ifilterソリューションはまだかなり読みやすいですが、多くの場合、適切な関数を定義するために多くのトラブルを経験しようとしても、操作を実行するだけの価値はありません。

于 2010-03-20T15:34:15.910 に答える
-1

を使用している場合ifilter、パラメータは定数である必要があります。その場合、デフォルトの引数を使用できますparameter=something。パラメータを変更する場合は、別の方法を使用して2項述語を取得する必要があります。

すでにリストを持っている場合は、組み込みのフィルターifilterに比べて少しやり過ぎです。

達成したいことを説明することは、より具体的な答えを出すのに役立ちます。

于 2010-03-20T13:20:15.717 に答える