@rsytrade

Как оптимально проверить вхождение элемента из одного списка в другом?

Есть два списка:
l_1 = ['val_1', 'val_2', 'val_3', 'val_4',]
l_2 = ['val_3', 'val_11', 'val_32', 'val_6',]
необходимо вывести True (выполнить условие), если любой из элементов l_1 встречается в l_2
как это реализовать без for или set&?
  • Вопрос задан
  • 875 просмотров
Решения вопроса 1
@rodion4dev
l_1_element_in_l_2: bool = any(map(lambda element: element in l_2, l_1))
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
как это реализовать без for или set&?

За while не говорилось
l_1 = ['val_1', 'val_2', 'val_3', 'val_4',]
l_2 = ['val_3', 'val_11', 'val_32', 'val_6',]

def compare(list1, list2):
    i = 0
    while i<len(list1):
        if l_1[i] in l_2:
            return True
        i += 1
    return False

compare(l_1, l_2)
# True
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Для ситуации, когда "чёрный список" длинный, но статичный, а элементы можно сравнивать, может иметь смысл отсортировать списки и двигаться по обоим. Если списки отсортированы заранее, то сложность будет O(M+N), вместо O(M*N). Если не отсортированы, то всё будет определяться скоростью сортировки.

black_list = list('1234567890h')
black_list.sort()
tested_list = list('dabeghfc')
tested_list.sort()
black_last, tested_last = len(black_list)-1, len(tested_list)-1
black_idx, tested_idx = 0, 0
black_item, tested_item = black_list[black_idx], tested_list[tested_idx]
while True:
    if black_item < tested_item and black_idx < black_last:
        # элемент в чёрном списке меньше - идём вперёд по чёрному списку, если есть куда
        black_idx += 1
        black_item = black_list[black_idx]
    elif black_item > tested_item and tested_idx < tested_last:
        # элемент в чёрном списке больше - идём вперёд по тестирумому списку, если есть куда
        tested_idx += 1
        tested_item = tested_list[tested_idx]
    else:  # либо элементы равны (есть вхождение), либо один из списков закончился
        break
print('Есть вхождение!' if black_item == tested_item else 'Нет вхождения')
Ответ написан
Комментировать
Dr_Elvis
@Dr_Elvis Куратор тега Python
В гугле забанен
Можно и без циклов вообще
a = ['a', 'b', 'c'] 
b = ['c', 'd', 'e'] 
seta = set(a)
setb = set(b)
setab = set(a+b) 
if len(seta)+len(setb) != len(setab):
    print('Есть совпадение')
else:
    print('Совпадений нет')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы