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

Проверьте, содержит ли элемент списка элементы из другого списка

У меня есть списки:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456', 'def-111', 'qwe-111']

bad = ['abc', 'def']

и хотите найти элементы, содержащие строки 'abc' и 'def' (а другие - плохие). Как я могу это сделать?

Почти такой же вопрос здесь.

4b9b3361

Ответ 1

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

>>> my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456', 'def-111', 'qwe-111']
>>> bad = ['abc', 'def']
>>> [e for e in bad if e in '\n'.join(my_list)]
['abc', 'def']

Из вашего вопроса вы можете протестировать каждый элемент в качестве подстроки для каждого элемента другого следующим образом:

>>> [i for e in bad for i in my_list if e in i]
['abc-123', 'abc-456', 'def-456', 'def-111']

Быстро (по сравнению с одним из других методов):

>>> def f1():
...    [item for item in my_list if any(x in item for x in bad)]
... 
>>> def f2():
...    [i for e in bad for i in my_list if e in i]
... 
>>> timeit.Timer(f1).timeit()
5.062238931655884
>>> timeit.Timer(f2).timeit()
1.35371994972229

Из вашего комментария, вот как вы получаете элементы, которые не соответствуют:

>>> set(my_list)-{i for e in bad for i in my_list if e in i}
{'ghi-789', 'qwe-111'}

Ответ 2

In [4]: filter(lambda item: any(x in item for x in bad), my_list)
Out[4]: ['abc-123', 'def-456', 'abc-456', 'def-111']

или

In [13]: [item for item in my_list if any(x in item for x in bad)]
Out[13]: ['abc-123', 'def-456', 'abc-456', 'def-111']

Ответ 3

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
bad = ['abc', 'def']
for s in some_list:
    for item in bad:
       if item in s:
          print 'Found ', s

Это просто, работает отлично и быстро (только если ваш список не очень большой.)

Ответ 4

some_list=['abc-123', 'def-456', 'ghi-789', 'abc-456']
bad = ['abc', 'def']
for i in range (0,len(bad)):
    if bad[i] in some_list:
        print('Found a bad entry:', bad[i])