Подтвердить что ты не робот

Ключевое слово python `in` как функция, используемая в фильтре

Можно ли использовать ключевое слово python in в фильтре? Я знаю, что двоичные, унарные операции присваивания эквивалентны вызову функции.

таких как

''!=3

совпадает с

''.__ne__(3)

есть ли аналогичная вещь для функции in? Я хочу сделать что-то подобное...

filter( list1.__in__, list2 )

Я предполагаю, что это можно выполнить с помощью записи функции... но я просто хочу знать, если она уже встроена или нет.

4b9b3361

Ответ 1

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]

Ответ 2

Вы ищете __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]

Ответ 3

В общем случае вы должны использовать функции модуля 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]

Примечание. Оператором & является пересечение.

Ответ 4

Понимание списка, как и в ответе Дэна Д., определенно является лучшим способом сделать это. Однако в более общем случае, когда вы хотите использовать что-то вроде 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]

Опять же, я представляю это только для ваших общих знаний; лучший способ справиться с этим конкретным случаем определенно со списком понимания, как в ответе Дэн Д.. Более подробная информация о lambdas в Python доступна здесь.