2015-11-29 13 views

答えて

15

filter()の組み込み逆関数はありません。単純にが逆転する可能性があるため、です。ただ、notを追加します。

positive = filter(lambda v: some_test(v), values) 
negative = filter(lambda v: not some_test(v), values) 

itertoolsモジュールは、ブールテストを反転することはとても簡単ですので、かなり冗長であるitertools.ifilterfalse()を、持っていません。 itertoolsバージョンは常にジェネレータとして動作します。

+2

あなたの推論はそれほど説得力がありません。最初のケースはすでに 'positive = filter(some_test、values)'と書くことができます。したがって、少なくとも陰性=フィルタ(非(some_test)、値)のように単純なものでなければなりません。 –

+0

注意! 'not'はPythonの組み込み関数で、' True'か 'False'のいずれかに直ちに評価されます。関数オブジェクトは 'False'と評価され、filterはそこで関数を期待しているので、最初の引数がブール型であるため、これはTypeErrorを与えます。他の読者は注意してください。 – Multihunter

+0

@ Multultunter:そして 'not'は組み込み*ではありません。それは演算子です。 –

5

別のオプション:

from operator import not_ 
compose = lambda f, g: lambda x: f(g(x)) 

... 

ys = filter(compose(not_, predicate), values) 

はあなたが利用可能compose()の前のロールバージョンを有することができる(例えば、機能またはtoolz)。

0

answer 'Martijn PietersへのコメントS' Ross Bencinaから:あなたの推論は非常に説得力がない

def _not(func): 
    def not_func(*args, **kwargs): 
     return not func(*args, **kwargs) 
    return not_func 
:最初のケースは、すでにそのためのために頼まれ、私は、単純な否定のラッパー関数を使用することをお勧めし

negative = filter(not(some_test), values) 

として、少なくとも同じくらい簡単であるべき書か

positive = filter(some_test, values) 

することができ

上記のように2行目を書き込むことができます(アンダースコアやその他の区別が付け加えられています)。 notオペレータは上書きできません):

negative = filter(_not(some_test), values) 
関連する問題