2012-07-04 11 views
13

Mam list:Sprawdź, czy element listy zawiera obiekty z innej listy

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

bad = ['abc', 'def'] 

i chcą, aby szukać elementów, które zawierają ciąg „abc” i „def” (i inne w zły). Jak mogę to zrobić?

Prawie to samo pytanie here.

+5

Wh dokładnie próbowałeś, a co nie działa? – msvalkon

+0

Jak wygląda twój aktualny kod? – Mizipzor

Odpowiedz

25

Jeśli chcesz tylko test, dołącz cel wypisz w łańcuchu i przetestuj każdy element z bad w następujący sposób:

>>> 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'] 

Od swoje pytanie, można przetestować każdy element jako podsłowo wobec każdego elementu drugiego w ten sposób:

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

Jest szybki (w stosunku do jednej z pozostałych metod):

>>> 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 

z Twojego komentarza, oto jak można dostać te elementy, które nie pasują do:

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

@Alex: Użyj set: 'set (my_list) - {i dla e w złym dla i na my_list if e in i}' – dawg

+0

Dziękuję bardzo! – Alex

+0

zaoszczędzisz dla mnie dzień – 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 

To proste, działa dobrze i szybko (tylko wtedy, gdy lista nie jest bardzo duży.)

+0

if any (pozycja w s): TypeError: obiekt 'bool' nie jest iterowalny – Alex

+1

Powinien to być 'if element in s:' Chyba – jadkik94

+0

masz rację, to będzie) zobacz moje edycje – 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'] 

lub

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

Podczas gdy ten fragment kodu może odpowiedzieć na pytanie, nie zawiera żadnego kontekstu wyjaśniającego, jak i dlaczego. Rozważ dodanie zdania lub dwóch, aby wyjaśnić swoją odpowiedź. – brandonscript

Powiązane problemy