Лисп "некоторые" в Python? - PullRequest
13 голосов
/ 29 апреля 2010

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

[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 или есть более идиотский способ сделать это?

Ответы [ 3 ]

19 голосов
/ 29 апреля 2010

Есть функция с именем any, которая примерно хочет, чтобы вы хотели. Я думаю, что вы ищете это:

[s for s in strings if any(re.match(f, s) for f in filters)]
7 голосов
/ 29 апреля 2010
[s for s in strings if any(re.match (f, s) for f in filters)]
1 голос
/ 29 апреля 2010

Python-лямбды - лишь малая часть их мощных аналогов LISP.

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

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

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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...