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

Однострочный, чтобы проверить, существует ли хотя бы один элемент в списке в другом списке?

Допустим, у меня есть список a=[1,2,3] И я хочу знать, существует ли хотя бы один из номеров в другом списке, например: b=[4,5,6,7,8,1] Другими словами, я хочу знать, существуют ли 1,2 или 3 (-ы) в списке b. Теперь я мог бы сделать что-то вроде

def func(a, b):
    for i in a:
       if i in b:
          return True
    return False

Но может ли быть способ поставить это в одну строку, чтобы сделать вещи в порядке?

4b9b3361

Ответ 1

Есть много способов сделать это. Самый прямой перевод:

any_in = lambda a, b: any(i in b for i in a)

Вы также можете использовать различные вещи, включая наборы, такие как:

any_in = lambda a, b: bool(set(a).intersection(b))

(который зависит от того, что элементы a являются хешируемыми, но если это правда, скорее всего, будет быстрее сделать набор из a и b для любого из этих подходов).

Изменить: isdisjoint лучше, чем intersection для Python 2.6 и выше, как отмечают различные люди ниже. Рад узнать об этом.:)

Ответ 2

Python 2.6 и выше:

def func(a, b):
  return not set(a).isdisjoint(b)

Для 2.4 или 2.5:

def func(a, b):
  return len(set(a).intersection(b)) != 0

Для 2.3 и ниже:

sudo apt-get update
sudo apt-get upgrade

;)

Ответ 3

простая однострочная линия:

any(i in b for i in a)

Ответ 4

Это заданная проблема, а не проблема с списком. При правильном типе данных ответ часто сразу становится очевидным: -)

def func(a, b):
    return not set(a).isdisjoint(b)

Ответ 5

Преобразуя свои списки в группы, вы можете выполнять на них заданные операции. Если пересечение больше 0, у вас есть хотя бы один элемент, соответствующий:

len(set(a) & set(b)) > 0

Ответ 6

Это должно сработать.

def func(a, b):
    return any([i in b for i in a])