J'ai une fonction pour choisir des morceaux à partir d'une liste de chaînes et de les retourner comme une autre liste:Comment utiliser des objets re match dans une compréhension de la liste
def filterPick(lines,regex):
result = []
for l in lines:
match = re.search(regex,l)
if match:
result += [match.group(1)]
return result
est-il un moyen de reformuler cela comme une liste compréhension? De toute évidence, c'est assez clair tel quel; juste curieux.
Merci à ceux qui ont contribué, une mention spéciale pour @Alex. Voici une version condensée de ce que j'ai fini avec; la méthode de match regex est passé à filterPick comme paramètre « pré-hissés »:
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, j'aime ça; merci et +1. J'ai un peu de lourdeur à faire avec ce code - devrais-je m'inquiéter des frais supplémentaires de mise en place et de démontage du "faux itérateur"? BTW Je souscris à la doctrine de "optimiser plus tard". –
@Brent, le "faux itérateur" devrait être négligeable par rapport à l'appel de recherche; une optimisation mineure consiste à utiliser '(regex.search (l),)' à la place de '[regex.search (l)]' (que je trouve plus lisible mais qui est minutieusement plus lent - je pensais que vous ne pouviez pas être pressé comme vous appeliez réellement la fonction 're.search' du module plutôt que la méthode de l'objet re.Tirer' regex.search' comme méthode liée en dehors du listcomp est une autre optimisation mineure mais utile, comme –
Dès que j'ai vu votre réponse, je me suis rendu compte que l'utilisation de re.search n'était pas la meilleure solution. Pourriez-vous clarifier pour moi comment vous "[tirer le] regex.search comme une méthode liée en dehors du listcomp"? votre patience avec un listcomp et Python noob –