2010-04-29 8 views
12

Mam listę ciągów i listę filtrów (które są również ciągi, które należy interpretować jako wyrażeń regularnych). Chcę listę wszystkich elementów na liście ciągów akceptowanych przez co najmniej jeden z filtrów. Idealnie, chciałbym napisać"Niektóre" Lispa w Pythonie?

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

gdzie część jest zdefiniowany jako

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

Czy coś takiego już dostępny w Pythonie, czy istnieje bardziej idiomatycznych sposób to zrobić?

Odpowiedz

17

Istnieje funkcja o nazwie any, która z grubsza chce mieć. Myślę, że szukasz to:

[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 są tylko ułamkiem tak potężne, jak ich odpowiedniki LISP.

W lambdas Pythona nie może zawierać bloki, tak dla pętli nie jest możliwe dla lambda

użyłbym zamknięcie, dzięki czemu nie trzeba prześle wykaz każdym razem

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

Twoja ocena Python's lambdas jest prawdziwy, z wyjątkiem frakcji 0,9. –

+0

jest na to ładna perspektywa "Jest jak oglądanie zwiastunu filmu, ekscytująca, ale nie do końca prawdziwa." http://rapd.wordpress.com/2007/05/09/lambda-in-python/ - chociaż z perspektywy sekretarzy nie podzielam jego entuzjazmu dla czystego kodu, daj mi funkcjonalność. –

Powiązane problemy