Tengo una función para escoger trozos de una lista de cadenas y devolverlos como otra lista:Cómo utilizar objetos de los partidos re en una lista por comprensión
def filterPick(lines,regex):
result = []
for l in lines:
match = re.search(regex,l)
if match:
result += [match.group(1)]
return result
¿Hay una manera de reformular esto como una lista ¿comprensión? Obviamente está bastante claro como está; Sólo curioso.
Gracias a los que contribuyeron, mención especial para @Alex. Aquí hay una versión condensada de lo que terminé; el método de coincidencia de expresiones regulares se pasa a filterPick como un parámetro de "pre-izado":
import re
def filterPick(list,filter):
return [ (l, m.group(1)) for l in list for m in (filter(l),) if m]
theList = ["foo", "bar", "baz", "qurx", "bother"]
searchRegex = re.compile('(a|r$)').search
x = filterPick(theList,searchRegex)
>> [('bar', 'a'), ('baz', 'a'), ('bother', 'r')]
Alex, me gusta eso; gracias y +1. Tengo que lidiar con este código bastante pesado, ¿debería preocuparme por la sobrecarga adicional de configurar y demoler el "iterador falso"? Por cierto me suscribo a la doctrina de "optimizar más tarde". –
@Brent, el "iterador falso" debe ser despreciable con la búsqueda; una optimización menor es usar '(regex.search (l),)' en lugar de '[regex.search (l)]' (que me parece más fácil de leer pero es mucho más lenta, pensé que no podrías ser de prisa, ya que en realidad llamaba a la función 're.search' del módulo en lugar del método del objeto re. Tirar' regex.search' como un método vinculado fuera de listcomp es otra optimización menor pero útil, por cierto, –
como Tan pronto como vi tu respuesta, me di cuenta de que el uso de re.search no era la mejor manera de hacerlo. ¿Podrías aclararme cómo harías "[tire de] regex.search como un método vinculado fuera de la listacomp"? Realmente aprecio tu paciencia con un listcomp y un novato de Python. –