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

Допустим, у меня есть список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

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

6 ответов

Решение

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

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 и выше, как отмечено различными людьми ниже. Рад узнать об этом.:)

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

;)

Простой однострочник будет:

any(i in b for i in a)

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

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

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

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

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

def func(a, b):
    return any([i in b for i in a])
Другие вопросы по тегам