2011-07-20 6 views
10

pythonキーワードinをフィルタに使用できますか?私はバイナリ、単項、代入演算は関数呼び出しと同等であることを知っています。pythonの `in`キーワードをフィルタに使用する関数

''!=3 

''.__ne__(3) 

in機能のために類似したものがある

と同じであるような? 私はこのようなことをしたい。 ..

filter(list1.__in__, list2) 

私は、これは機能で書き込みを行うことができると思います...しかし、私はちょうどそれがすでに構築されているかどうかを知りたいです。

答えて

8

あなたは__contains__をお探しですか?

>>> [1, 2, 3].__contains__(2) 
True 
>>> [1, 2, 3].__contains__(4) 
False 

そして、あなたが何をしたいのために:

>>> list1 = [2, 4, 6, 8, 10] 
>>> filter(list1.__contains__, [1, 2, 3, 4, 5]) 
[2, 4] 
15
filter(list1.__contains__, list2) 

をよりきれいにと書かれている:

[ v for v in list2 if v in list1 ] 

と同等性を示すこと:

>>> list1 = [2, 4, 6, 8, 10] 
>>> list2 = [1, 2, 3, 4, 5] 
>>> [ v for v in list2 if v in list1 ] 
[2, 4] 
4

一般に、operatorモジュールの機能を使用する必要があります。この場合はoperator.containsになります。

しかし、セットを使用してこれを行う方法は、はるかに効率があります:

In [1]: list1 = [2, 4, 6, 8, 10] 

In [2]: list2 = [1, 2, 3, 4, 5] 

In [3]: list(set(list1) & set(list2)) 
Out[3]: [2, 4] 

注:&オペレータが交差点です。

+2

セットを使用しても要素の順序は維持されません。 –

2

Dan Dの回答のように、リストの理解が間違いなくこれを実行する最良の方法です。あなたが引数として別の関数を取る関数でinまたはnotのようなものを使用したい場所より一般的なケースでは、しかし、あなたは、ラムダ関数を使用することができます。

>>> list1 = [2, 4, 6, 8, 10] 
>>> list2 = [1, 2, 3, 4, 5] 
>>> in_check = lambda item: item in list1 
>>> filter(in_check, list2) 
[2, 4] 

繰り返しますが、私はこれを提示あなたの一般的な知識;この特定のケースを処理する最善の方法は、Dan D.の答えのように、リストの理解に間違いありません。 Pythonのlambdasの詳細についてはhereをご覧ください。

+0

'operator'モジュールの関数は、はるかに高速であるため、使うべきです。 – schlamar

+1

@ ms4py:私はほとんどのケースでは、「x in y」の読みやすさと使いやすさの向上が、演算子モジュールを使用する利点を上回ると主張します。私はパフォーマンスの向上が必要であることを知った後、 'operator'モジュールだけを使用します。 –

関連する問題