可以将这段map/filter代码转换为列表推导式吗?

0 投票
2 回答
674 浏览
提问于 2025-04-17 09:09

我有一堆正则表达式,想在一个字符串上运行这些表达式。我不在乎哪些表达式匹配到了,我只想要它们的结果(也就是 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]

撰写回答