可以将这段map/filter代码转换为列表推导式吗?
我有一堆正则表达式,想在一个字符串上运行这些表达式。我不在乎哪些表达式匹配到了,我只想要它们的结果(也就是 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]
不过我感觉这应该可以用一个更简洁的方式来实现,像是用一个列表推导式。如果可以的话,它应该是什么样子的呢?
另外,比较一般来说,列表推导式和 map/filter 是一样的吗?还是说它们只是 map/filter 功能的一部分?
2 个回答
1
一般来说,filter和map这两个功能可以用列表推导式来实现(具体可以参考文档)。在这个例子中,你可以这样写:matches = [x.match(domain) for x in (first_re, second_re, third_re) if x.match(domain)]
。
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]