Несколько параметров для функции __contains__ - PullRequest
2 голосов
/ 25 апреля 2011

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

Например: [0,1,4,8,87,6,4,7,5, 'а', 'е', 'э', 'фа', 'уг']

Я бы хотел проверить, есть ли один из пунктов (8,5, 'f') в этом списке.

Как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 25 апреля 2011

AFAIK, __contains__ принимает только один аргумент, и его нельзя изменить.

Однако вы можете сделать следующее, чтобы получить желаемый результат:

>>> a = [0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']
>>> any(map(lambda x: x in a, (8,5,'f')))
True

или

>>> from functools import partial
>>> from operator import contains
>>> f = partial(contains, a)
>>> any(map(f, (2,3)))
False
3 голосов
/ 25 апреля 2011

Используйте встроенный тип set .

>>> l =  [0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']
>>> s = (8,5,'f')
>>> bool(set(s) & set(l))
True

Методы набора также будут принимать итерации в качестве аргументов, избегая создания набора.

Наиболее краткий:

2.6 предоставляет set.isdisjoint (other) , который, вероятно, оптимизирован для возврата, как только будет найден общий элемент.

>>> not set(l).isdisjoint(s)
True

Если вы хотите выполнить цикл:

>>> any((val in s) for val in l)
True
2 голосов
/ 25 апреля 2011

Вы можете использовать наборы:

list1 = [0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']
tuple1 = (8,5,'f')

def my_contains(first, second):
    return bool(set(first).intersection(second))

my_contains(list1, tuple1) # True
my_contains(list1, [1]) # True
my_contains(list1, (125,178,999)) # False
...