2012-07-04 15 views
13

tengo unas listas:elemento de la lista contiene objetos de otra lista

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

bad = ['abc', 'def'] 

y quiero buscar elementos que contengan la cadena 'abc' y 'def' (y otros en mal). ¿Cómo puedo hacer eso?

Casi la misma pregunta here.

+5

Wh exactamente lo has probado y lo que no funciona? – msvalkon

+0

¿Cómo se ve tu código actual? – Mizipzor

Respuesta

25

Si lo que desea es una prueba, se unen a la diana liste en una cadena y pruebe cada elemento de bad como lo siguiente:

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

Desde su pregunta, usted puede probar cada elemento como una cadena sub en contra de la que cada elemento de la otra de esta manera:

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

Es rápido (en comparación con uno de los otros métodos):

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

Desde su comentario, aquí es cómo obtener los elementos que no coinciden:

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

@Alex: Use a set: 'set (mi_lista) - {i para e en mal para i en my_list si e en i}' – dawg

+0

¡Muchas gracias! – Alex

+0

me guardaste un día – 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 

Es muy sencillo, funciona bien y rápido (sólo si su lista no es muy grande.)

+0

si lo hay (elemento en s): TypeError: el objeto 'bool' no es iterable – Alex

+1

Debe ser 'si el elemento en s:' Supongo – jadkik94

+0

tiene razón, sería) vea mis ediciones – 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'] 

o

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

Aunque este fragmento de código puede responder a la pregunta, no proporciona ningún contexto para explicar cómo o por qué. Considere agregar una o dos oraciones para explicar su respuesta. – brandonscript

Cuestiones relacionadas