Можно ли преобразовать этот код карты / фильтра в понимание списка? - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть список регулярных выражений, которые я хочу выполнить для одной строки.Мне все равно, какие выражения совпадают, я просто хочу их результаты (re.Match объекты).

Конечно, с циклом for это легко, но я хотел что-то более питоническое.Вот что у меня сейчас:

all_matches = map(lambda x: x.match(domain), 
                  (first_re, second_re, third_re))
matches = [m for m in all_matches if m]

Я чувствую под своей кожей, однако, что это должно быть выполнимо как единственное понимание.Как это должно выглядеть, если это вообще возможно?

Кроме того, в более общем смысле - являются ли списочные представления эквивалентными карте / фильтру или они просто имеют подмножество возможностей m / f?

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Можно написать это как простое понимание списка. Однако r.match(domain) нужно будет оценить дважды:

matches = [r.match(domain) for r in (first_re, second_re, third_re) if r.match(domain)]

Или вам нужно написать двойное понимание списка:

matches = [a for a in (r.match(domain) for r in (first_re, second_re, third_re)) if a]
1 голос
/ 28 декабря 2011

Как правило, фильтр / карта могут быть записаны в виде списка (см. Документацию по этому вопросу).В этом случае вы можете написать matches = [x.match(domain) for x in (first_re, second_re, third_re) if x.match(domain)].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...