2015-11-29 10 views

Odpowiedz

15

Nie, nie ma wbudowanej funkcji odwrotnej dla filter(), ponieważ można po prostu odwrócić test. Wystarczy dodać not:

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

Moduł itertools ma itertools.ifilterfalse(), co jest raczej zbędny, ponieważ odwracanie logiczną testu jest tak prosta. Wersja itertools zawsze działa jako generator.

+2

Twoje uzasadnienie nie jest zbyt przekonujące. Pierwszy przypadek może już być zapisany jako "positive = filter (some_test, values)", więc to, o co proszą, powinno być co najmniej tak proste, jak 'negative = filter (not (some_test), values)' –

+0

OSTROŻNIE! 'not' jest wbudowanym pythonem, który natychmiast analizuje wartość' True' lub 'False'. Obiekty funkcyjne oceniają na 'False', a filtr oczekuje funkcji tam, więc daje to TypeError, ponieważ pierwszy argument to Boolean. Inni czytelnicy uważajcie. – Multihunter

+0

@Multihunter: a 'not' nie * nie jest wbudowane *. To operator. –

5

Inną opcją:

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

... 

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

może mieć wstępnie walcowane wersję compose() dostępnych (np funkcjonalnej lub toolz).

0

From 'komentarzu do Martijn Pieters s' s answerRoss Bencina:

Twoje rozumowanie nie jest bardzo przekonująca. W pierwszym przypadku może być już napisany

positive = filter(some_test, values) 

zatem co jest proszony o powinny być co najmniej tak samo proste, jak

negative = filter(not(some_test), values) 

Proponuję za pomocą prostej funkcji negującymi Wrapper:

def _not(func): 
    def not_func(*args, **kwargs): 
     return not func(*args, **kwargs) 
    return not_func 

co pozwala napisać drugą linię jak wyżej (z dodanym podkreśleniem lub innym rozróżnieniem, ponieważ operator not nie może i prawdopodobnie nie powinien być nadpisywany):

negative = filter(_not(some_test), values) 
Powiązane problemy