2011-07-20 14 views
10

jest możliwe użycie słowa kluczowego python in w filtrze? Wiem, że binarne, jednoargumentowe operacje przypisania są równoważne wywołaniu funkcji.python `in` słowo kluczowe jako funkcja używana w filtrze

takich jak

''!=3 

jest taka sama jak

''.__ne__(3) 

istnieje analogiczna sprawa dla funkcji in? Chcę zrobić coś takiego. ..

filter(list1.__in__, list2) 

myślę, że to może być dokonane ze pisanie w funkcji ... ale ja po prostu chcę wiedzieć, czy jest on już wbudowany czy nie.

Odpowiedz

8

Szukasz __contains__.

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

I za to, co chcesz zrobić:

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

jest bardziej czysto zapisać jako:

[ v for v in list2 if v in list1 ] 

i pokazać równoważności:

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

Generalnie powinieneś używać funkcji z modułu operator, w tym przypadku będzie to operator.contains.

Ale jest znacznie bardziej efektywny sposób zrobić za pomocą zestawów:

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] 

Uwaga: Operator & jest skrzyżowanie.

+2

Używanie zestawów nie zachowuje porządku elementów. –

2

Zrozumienie listy, jak w odpowiedzi Dana D., jest zdecydowanie najlepszym sposobem na zrobienie tego. W bardziej ogólnym przypadku, chociaż, w którym chcesz używać coś jak in lub not w funkcję, która bierze inną funkcję jako argument, można użyć funkcji lambda:

>>> 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] 

Znowu przedstawić to tylko dla twoja ogólna wiedza; najlepszym sposobem na zajęcie się tym konkretnym przypadkiem jest zdecydowanie ze zrozumieniem listy, jak w odpowiedzi Dana D. Więcej informacji na temat lambdas w Pythonie jest dostępnych here.

+0

Powinieneś używać funkcji z modułu 'operator', ponieważ są one znacznie szybsze. – schlamar

+1

@ ms4py: Twierdzę, że w większości przypadków poprawiona czytelność i łatwość użycia 'xw y' przewyższają korzyści wynikające z używania modułu operatora. Używałbym tylko modułu 'operator' po tym, jak wiedziałem, że potrzebuję zwiększenia wydajności. –