列表推导式与条件?

7 投票
2 回答
7553 浏览
提问于 2025-04-15 11:24

我想看看能不能用列表推导式来优化这段代码。
假设我有以下这些列表:

a_list = [
        'HELLO',
        'FOO',
        'FO1BAR',
        'ROOBAR',
        'SHOEBAR'
        ]

regex_list =   [lambda x: re.search(r'FOO', x, re.IGNORECASE),
                lambda x: re.search(r'RO', x, re.IGNORECASE)]

我基本上想把所有在 regex_list 中没有匹配项的元素,添加到另一个列表里。

比如说,结果应该是这样的 ==>

newlist = []
for each in a_list:
    for regex in regex_list:
        if(regex(each) == None):
            newlist.append(each)

我该怎么用列表推导式来实现这个呢?这样做可能吗?

2 个回答

0

我把你的代码简化成这样:

a_list = [
          'HELLO',
          'FOO',
          'FO1BAR',
          'ROOBAR',
          'SHOEBAR'
          ]
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)    

然后你有两个选择:

  1. 过滤

    newlist = filter(regex_func, a_list)

  2. 列表推导式

    newlist = [x for x in a_list if regex_func(x)]

18

当然,我觉得这样做应该可以。

newlist = [s for s in a_list if not any(r(s) for r in regex_list)]

编辑: 经过仔细检查,我发现你的示例代码实际上是将中每个不符合所有正则表达式的字符串都添加到新列表中。而且,更重要的是,它会针对每个不匹配的正则表达式添加一次每个字符串。我的列表推导式做的正是我认为你想要的,就是只添加每个不匹配任何正则表达式的字符串的一份副本。

撰写回答