Cómo comprobar si una cadena es una subcadena de elementos en una lista de cadenas

Resuelto SandyBr asked hace 13 años • 17 respuestas

¿ Cómo busco elementos que contengan la cadena 'abc'en la siguiente lista?

xs = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

Lo siguiente comprueba si 'abc'está en la lista, pero no detecta 'abc-123'y 'abc-456':

if 'abc' in xs:
SandyBr avatar Jan 30 '11 20:01 SandyBr
Aceptado

Para comprobar la presencia de 'abc'en cualquier cadena de la lista:

xs = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

if any("abc" in s for s in xs):
    ...

Para obtener todos los artículos que contienen 'abc':

matching = [s for s in xs if "abc" in s]
Sven Marnach avatar Jan 30 '2011 13:01 Sven Marnach

Simplemente descarte esto: si necesita hacer coincidir más de una cadena, por ejemplo abcy def, puede combinar dos comprensiones de la siguiente manera:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

Producción:

['abc-123', 'def-456', 'abc-456']
fantabolous avatar Aug 03 '2014 06:08 fantabolous

Úselo filterpara obtener todos los elementos que tienen 'abc':

>>> xs = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> list(filter(lambda x: 'abc' in x, xs))
['abc-123', 'abc-456']

También se puede utilizar una lista por comprensión:

>>> [x for x in xs if 'abc' in x]
MAK avatar Jan 30 '2011 13:01 MAK

Si sólo necesita saber si 'abc' está en uno de los elementos, esta es la forma más corta:

if 'abc' in str(my_list):

Nota: esto supone que 'abc' es un texto alfanumérico. No lo utilice si 'abc' puede ser simplemente un carácter especial (es decir, []', ).

RogerS avatar Apr 13 '2016 08:04 RogerS

Esta es una pregunta bastante antigua, pero ofrezco esta respuesta porque las respuestas anteriores no abordan elementos de la lista que no son cadenas (o algún tipo de objeto iterable). Dichos elementos provocarían que fallara la comprensión de la lista completa con una excepción.

Para tratar con elegancia dichos elementos de la lista omitiendo los elementos no iterables, utilice lo siguiente:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

entonces, con tal lista:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

aún recibirás los artículos coincidentes ( ['abc-123', 'abc-456'])

La prueba de iterable puede no ser la mejor. Lo saqué de aquí: En Python, ¿cómo puedo determinar si un objeto es iterable?

Robert Muil avatar Oct 20 '2011 13:10 Robert Muil