Ключевое слово python `in` как функция, используемая в фильтре
Можно ли использовать ключевое слово python in
в фильтре? Я знаю, что двоичные, унарные операции присваивания эквивалентны вызову функции.
таких как
''!=3
совпадает с
''.__ne__(3)
есть ли аналогичная вещь для функции in
?
Я хочу сделать что-то подобное...
filter( list1.__in__, list2 )
Я предполагаю, что это можно выполнить с помощью записи функции... но я просто хочу знать, если она уже встроена или нет.
Ответы
Ответ 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 доступна здесь.