2012-07-04 2 views
13

У меня есть списки:Проверьте список содержит предмет из другого списка

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

bad = ['abc', 'def'] 

и хочу искать элементы, которые содержат строку «ABC» и «четкость» (и другие в плохо). Как я могу это сделать?

Почти такой же вопрос here.

+5

Wh точно вы пробовали и что не работает? – msvalkon

+0

Как выглядит ваш текущий код? – Mizipzor

ответ

25

Если вы просто хотите тест, присоединиться к цели перечислить в строку и проверить каждый элемент 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'} 
+0

@Alex: используйте set: 'set (my_list) - {i для e in bad для i в my_list, если e in i}' – dawg

+0

Спасибо вам большое! – Alex

+0

вы сохранили мне день – Sakeer

1
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 

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

+0

, если таковые имеются (item in s): TypeError: объект «bool» не является итерабельным – Alex

+1

Это должно быть 'if item in s:' Я думаю, – jadkik94

+0

вы правы, это было бы) см. Мои правки – Feanor

6
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'] 
0
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]) 
+0

Хотя этот фрагмент кода может ответить на вопрос, он не дает никакого контекста, чтобы объяснить, как и почему. Подумайте о том, чтобы добавить предложение или два, чтобы объяснить ваш ответ. – brandonscript

Смежные вопросы