2010-04-29 9 views
12

Ich habe eine Liste von Strings und eine Liste von Filtern (die auch Strings sind, die als reguläre Ausdrücke interpretiert werden). Ich möchte eine Liste aller Elemente in meiner String-Liste, die von mindestens einem der Filter akzeptiert werden. Idealerweise würde ichLisp "etwas" in Python?

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

schreiben, wo einige als

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

etwas wie das ist bereits in Python, oder gibt es einen mehr idiomatischen Weg, dies zu tun?

Antwort

17

Es gibt eine Funktion namens any, die in etwa wollen Sie wollen. Ich glaube, Sie für diese suchen:

[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

Python Lambda ist nur ein Bruchteil so stark wie ihre LISP Pendants.

In Python Lambdas können Blöcke nicht enthalten, so dass die for-Schleife für eine Lambda nicht möglich ist

ich einen Verschluss verwenden würde, so dass Sie die Liste

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

Ihre Beurteilung jedes Mal, müssen nicht senden Pythons Lambdas ist wahr, außer der Bruch ist 0.9. –

+0

Heres eine schöne Perspektive "Ist wie Trailer eines Films zu sehen. Aufregend, aber nicht ganz das Richtige." http://rapd.wordpress.com/2007/05/09/lambda-in-python/ - obwohl ich aus Sicht der Lisper seine Begeisterung für sauberen Code nicht teile, gib mir Funktionalität. –