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?
102
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 filter
funció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.
lambda
el compañero perfectofilter
en este caso? Creo que escribir una función separada solo para verificar siab
está en la lista dada es una exageración. También lo es escribir una función más general que básicamente envuelve alin
operador. ¿Cómo lo usaríasfilter
de una manera más clara sinlambda
aquí?[x for x in L if 'ab' in x]
fuente
# To support matches from the beginning, not any matches: items = ['a', 'ab', 'abc', 'bac'] prefix = 'ab' filter(lambda x: x.startswith(prefix), items)
fuente
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
in
operador 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)
fuente
mylist = ['a', 'ab', 'abc'] assert 'ab' in mylist
fuente