Ho una funzione di scegliere grumi da una lista di stringhe e di ritorno, un altro elenco:Come usare re partita oggetti in una comprensione lista
def filterPick(lines,regex):
result = []
for l in lines:
match = re.search(regex,l)
if match:
result += [match.group(1)]
return result
C'è un modo per riformulare questo come un elenco comprensione? Ovviamente è abbastanza chiaro com'è; solo curioso.
Grazie a coloro che hanno contribuito, menzione speciale per @Alex. Ecco una versione condensata di ciò che ho finito con; il metodo di espressione regolare corrispondenza viene passata a filterPick come parametro "pre-issata":
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, mi piace; grazie e +1. Ho un po 'di sollievo abbastanza pesante da fare con questo codice - dovrei preoccuparmi del sovraccarico extra di installazione e abbattimento del "finto iteratore"? A proposito, sottoscrivo la dottrina di "ottimizzare più tardi". –
@Brent, il "faux iterator" dovrebbe essere trascurabile rispetto alla chiamata di ricerca; un'ottimizzazione minore è usare '(regex.search (l),)' invece di '[regex.search (l)]' (che trovo più leggibile ma è minuziosamente lento - pensavo che non si potesse in fretta perché in effetti stavi chiamando la funzione 're.search' dal modulo piuttosto che il metodo di re object.Tirare il comando' regex.search' come metodo vincolato al di fuori di listcomp è un'altra ottimizzazione minore ma utile, btw –
as Appena ho visto la tua risposta ho capito che usare re.search non era il modo migliore per andare. Potresti chiarire per me come potresti "[tirare] regex.search come metodo vincolato al di fuori della listcomp"? la tua pazienza con un listcomp e Python noob –