2011-12-28 73 views
0

我有一个我想在单个字符串上运行的正则表达式列表。我不在乎哪个表达式匹配,我只是想要他们的结果(re.Match对象)。是否可以将此映射/过滤器代码转换为列表理解?

当然用for循环很容易,但我想要更pythonic的东西。这是我现在得到的:

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能力的子集?

+1

map/filter可以完成列表解析功能的一部分。 – 2011-12-28 15:45:45

回答

3

这可以写成一个简单的列表理解。然而,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] 
+0

双列表理解 - 为什么我没有想到:)谢谢! – GDR 2011-12-30 21:01:23

1

在一般情况下,过滤器/图可以写成一个列表理解(关于这一点见documentation)。在这种情况下,您可以编写matches = [x.match(domain) for x in (first_re, second_re, third_re) if x.match(domain)]