Filtrar una lista de cadenas según el contenido

102

Dada la lista ['a','ab','abc','bac'], quiero calcular una lista con cadenas que 'ab'contengan. Es decir, el resultado es ['ab','abc']. ¿Cómo se puede hacer esto en Python?

Chris.Jie
fuente

Respuestas:

170

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

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

Otra forma es usar la filterfunción. En Python 2:

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

En Python 3, devuelve un iterador en lugar de una lista, pero puede convertirlo:

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

Aunque es una mejor práctica utilizar una comprensión.

Eli Bendersky
fuente
30
@ S.Lott: ¿por qué? ¿Qué tiene de malo aprender temas útiles de programación avanzada en un contexto adecuado?
Eli Bendersky
12
@ S.Lott: Creo que las lambdas están facilitando la consideración de funciones como objetos de primera clase, lo cual es importante para algunos paradigmas de programación. No diría que son muy importantes para mí , pero creo que incluso los novatos pueden beneficiarse de pensar en la programación de esta manera, y definitivamente no lo llamarían infligir .
Eli Bendersky
6
@ S.Lott: ¿pero no es lambdael compañero perfecto filteren este caso? Creo que escribir una función separada solo para verificar si abestá en la lista dada es una exageración. También lo es escribir una función más general que básicamente envuelve al inoperador. ¿Cómo lo usarías filterde una manera más clara sin lambdaaquí?
Eli Bendersky
5
No solo los n00bs encuentran esta respuesta
Bryan
9
Soy un n00b y ahora me presentan a lambda. Me siento increíble al saberlo. ahora aprenderé más al respecto.
a_secenthusiast
17
[x for x in L if 'ab' in x]
Ignacio Vázquez-Abrams
fuente
16
# To support matches from the beginning, not any matches:

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

filter(lambda x: x.startswith(prefix), items)
Itay Maman
fuente
evite la lista como nombre de variable ya que este es un tipo de objeto de Python.
Rutger Hofste
6

Probé esto rápidamente en el shell interactivo:

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

¿Por qué funciona esto? Porque el inoperador está definido para que las cadenas signifiquen: "es una subcadena de".

Además, es posible que desee considerar escribir el bucle en lugar de utilizar la sintaxis de comprensión de lista utilizada anteriormente:

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)
Daren Thomas
fuente
-2
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist
Yann Ramin
fuente