2010-04-29 7 views
12

J'ai une liste de chaînes et une liste de filtres (qui sont aussi des chaînes, à interpréter comme des expressions régulières). Je veux une liste de tous les éléments de ma liste de chaînes acceptés par au moins un des filtres. Idéalement, j'écrire"Quelques" de Lisp en Python?

[s for s in strings if some (lambda f: re.match (f, s), filters)] 

où certains est défini comme

def some (pred, list): 
    for x in list: 
     res = pred (x) 
     if res: 
      return res 
    return False 

Est-ce quelque chose comme ça déjà disponible en Python, ou est-il un moyen plus idiomatiques de le faire?

Répondre

17

Il existe une fonction appelée any qui correspond à peu près à ce que vous voulez. Je pense que vous cherchez ceci:

[s for s in strings if any(re.match(f, s) for f in filters)] 
7
[s for s in strings if any(re.match (f, s) for f in filters)] 
1

de lambda Python ne sont qu'une fraction aussi puissante que leurs homologues LISP.

En lambdas python ne peut pas inclure des blocs, de sorte que la boucle est impossible pour un lambda

J'utiliser une fermeture de sorte que vous ne devez envoyer la liste à chaque fois

def makesome(list): 
    def some(s) 
     for x in list: 
      if x.match(s): 
       return True 
     return False 
    return some 

some = makesome(list) 

[s for s in strings if some(s)] 
+0

Votre évaluation Lambdas de Python est vrai, sauf que la fraction est de 0,9. –

+0

heres une belle perspective à ce sujet "Est-ce que c'est comme regarder la bande-annonce d'un film.Excitant, mais pas tout à fait la vraie chose." http://rapd.wordpress.com/2007/05/09/lambda-in-python/ - bien que d'un point de vue de lispers, je ne partage pas son enthousiasme pour le code propre, donnez-moi la fonctionnalité. –