2010-01-28 17 views
45

Dada la lista ['a','ab','abc','bac'], quiero calcular una lista con cadenas que tengan 'ab' en ellas. Es decir. el resultado es ['ab','abc']. ¿Cómo se puede hacer esto en Python?Filtrar una lista de cadenas según el contenido

+0

gracias Eli Bendersky –

+0

Dada la lista [' a ',' b ',' c ',' a ',' b '], quiero calcular una lista con cadenas que tengan' a 'y' b 'en ellas. Es decir. el resultado es ['a', 'b']. ¿Cómo se puede hacer esto en Python? –

Respuesta

71

Este simple filtrado se puede lograr de muchas maneras con Python. El mejor enfoque es el uso de "listas por comprensión" de la siguiente manera:

>>> lst = ['a', 'ab', 'abc', 'bac'] 
>>> res = [k for k in lst if 'ab' in k] 
>>> res 
['ab', 'abc'] 
>>> 

Otra forma es utilizar la función filter:

>>> filter(lambda k: 'ab' in k, lst) 
['ab', 'abc'] 
>>> 
+0

-1: Lambda. Por favor, no inflija lambda en n00bs. –

+26

@ S.Lott: ¿por qué? ¿Qué hay de malo en aprender temas útiles de programación avanzada en un contexto adecuado? –

+0

@Edi Bendersky: ¿Porque son más confusos que útiles? ¿Porque lleva a preguntas que son respondidas por "use a def"? ¿Porque rara vez lleva a algo mejor que el código de golf? No sé, me parecen inútiles, después de 30 años de programación en una amplia variedad de idiomas. Pero supongo que son realmente importantes para ti. –

12
[x for x in L if 'ab' in x] 
+0

usted gana por 48 segundos :-) –

3

intentado hacer esto rápidamente en el intérprete de comandos interactivo:

>>> l = ['a', 'ab', 'abc', 'bac'] 
>>> [x for x in l if 'ab' in x] 
['ab', 'abc'] 
>>> 

Por qué funciona esto? Porque el in operator se define para que las cadenas signifiquen: "es una subcadena de".

Además, es posible que desee considerar escribir el bucle en lugar de utilizar el list comprehension syntax utilizado anteriormente:

l = ['a', 'ab', 'abc', 'bac'] 
result = [] 
for s in l: 
    if 'ab' in s: 
     result.append(s) 
0
mylist = ['a', 'ab', 'abc'] 
assert 'ab' in mylist 
5
# To support matches from the beginning, not any matches: 

list = ['a', 'ab', 'abc', 'bac'] 
prefix = 'ab' 

filter(lambda x: x.startswith(prefix), list) 
Cuestiones relacionadas