2010-04-29 16 views
12

Tengo una lista de cadenas y una lista de filtros (que también son cadenas, para interpretarlas como expresiones regulares). Quiero una lista de todos los elementos en mi lista de cadenas aceptados por al menos uno de los filtros. Idealmente, me gustaría escribirLisp "algo" en Python?

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

donde algunos se define como

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

es algo así como que ya está disponible en Python, o hay una manera más idiomática para hacer esto?

Respuesta

17

Hay una función llamada any que desea aproximadamente desea. Creo que busca esto:

[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

pitón de lambda son sólo una fracción tan poderoso como sus contrapartes LISP.

En lambdas pitón no puede incluir bloques, por lo que el bucle no es posible para un lambda

me gustaría utilizar un cierre de modo que usted no tiene que enviar la lista cada vez que

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

Su evaluación de La lambda de Python es verdadera, excepto que la fracción es 0.9. –

+0

heres a nice perspective on it "Es como ver el avance de una película. Emocionante, pero no del todo real". http://rapd.wordpress.com/2007/05/09/lambda-in-python/ - aunque desde una perspectiva de lispers, no comparto su entusiasmo por el código limpio, dame funcionalidad. –