Wie man re-match-Objekte in einem Listenverständnis verwendet
Habe ich eine Funktion zu wählen Klumpen aus einer Liste von strings und Rückgabe als eine andere Liste:
def filterPick(lines,regex):
result = []
for l in lines:
match = re.search(regex,l)
if match:
result += [match.group(1)]
return result
Gibt es eine Möglichkeit, zu formulieren, dies als eine list comprehension? Natürlich, es ist ziemlich klar wie es ist; einfach nur neugierig.
Danke an alle, die dazu beigetragen, eine Besondere Erwähnung für @Alex. Hier ist eine verkürzte version von dem, was landete ich mit; die regex-match-Methode übergeben wird, filterPick als "pre-hochgezogen" parameter:
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')]
InformationsquelleAutor der Frage Brent.Longborough | 2010-03-12
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der "trick" ist die
for m in [regex.search(l)]
Teil-das ist, wie Sie "assign" ein Wert, den Sie brauchen, um mehr als einmal innerhalb einer Liste Verständnis -- hinzufügen, nur so eine Klausel, wo sich das Objekt "iteriert" über eine single-item-Liste, mit der ein Wert, den Sie möchten, auf "zuweisen". Einige halten dies für stilistisch fragwürdig, aber ich finde es praktisch manchmal.InformationsquelleAutor der Antwort Alex Martelli
InformationsquelleAutor der Antwort Ignacio Vazquez-Abrams
Könnte es verkürzt ein wenig
Könnte man es alles in einer Zeile, aber das würde bedeuten, Sie hätte zu entsprechen, wird jede Zeile zweimal, das wäre ein bisschen weniger effizient.
InformationsquelleAutor der Antwort Wolph
, Das funktioniert auch mit einer such-Abfrage, die Sie für die Jagd sind unten in einer Liste
`P='a', 'b', 'c'
'b' in P` gibt true zurück,
InformationsquelleAutor der Antwort waldi