列表推导式与条件语句?

7

我正在尝试使用列表推导式来改进这段代码。假设我有以下几个列表:

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)

我能用列表推导式完成这个操作吗?这样做是否可行?

-1:lambda表达式。直接使用正则表达式本身,不要浪费时间将一个完美的正则表达式包装在函数中。 - S.Lott
2个回答

18

没问题,我想这应该可以解决

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

编辑:仔细检查后,我注意到您的示例代码实际上将a_list中不匹配所有正则表达式的每个字符串添加到新列表中 - 更重要的是,它会为每个未匹配的正则表达式添加一次每个字符串。我的列表推导式实现了我认为您想做的事情,即仅添加不匹配任何正则表达式的每个字符串的一个副本。


与他提供的代码不同,因为“each”永远不会像示例中那样被附加超过一次。 然而,我相信这正是他想要实现的。 - bayer
还有一个问题,如果我用返回列表的函数替换a_list,它只会被调用一次吗?还是每次迭代都会被调用?例如:def returnalist(): return ['klsdfj','kldffjsdkl','hello','somethinghats']并执行以下操作:newlist = [s for s in returnalist() if not any(r(s) for r in regex_list)]returnalist会不断被调用吗? - UberJumper
在这种情况下,它应该只被调用一次。尽管您总是可以尝试并查看 ;) - David Z
David,谢谢你向我展示了any的潜力。我以前从未使用过它。 - praavDa

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)]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接