Подтвердить что ты не робот

Lisp "some" в Python?

У меня есть список строк и список фильтров (которые также являются строками, которые должны интерпретироваться как регулярные выражения). Мне нужен список всех элементов в моем списке строк, которые принимаются хотя бы одним из фильтров. В идеале я бы написал

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

где некоторые определены как

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

Что-то подобное уже доступно в Python, или есть более идиоматический способ сделать это?

4b9b3361

Ответ 1

Существует функция, называемая any, которая вам грубо нужна. Я думаю, вы ищете это:

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

Ответ 2

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

Ответ 3

Python лямбда является только такой же мощной, как и их копии LISP.

В python lambdas не может включать блоки, поэтому цикл for невозможен для lambda

Я бы использовал закрытие, так что вам не нужно отправлять список каждый раз

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)]