使用中间结果的嵌套列表理解

2024-06-16 10:26:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图搜索一个函数的输出,它没有设置结果代码的礼貌。我可以通过混入stderr流中的“error:”字符串判断它失败了,该字符串通常位于不同的转换状态消息的中间。在

我有下面的列表理解方法,但是会扫描两次“error:”字符串。因为它只是重新扫描实际的错误线,它工作得很好,但它使我恼火,我不知道如何使用单一的扫描。工作代码如下:

errors = [e[e.find('error:'):] for e in err.splitlines() if 'error:' in e]

显然(也是错误的)简化方法是保存“find”结果

^{pr2}$

但是,我得到“UnboundLocalError:赋值前引用了局部变量‘e’”。在理解中盲目地颠倒“for”也是失败的。这是怎么做到的?在

谢谢。肯特


Tags: 方法函数字符串代码in消息列表for
3条回答

但JBernave的解决方案对我很有效:

[errstr[i:] for i,errstr in
 ((e.find('error:'), e) for e in err.splitlines())
 if i != -1]

您可以将'error'的检查放在生成器表达式中:

[e[i:] for i,e in
 ((e.find('error:'),e) for e in err.splitlines())
 if i != -1]

您所做的是创建一个嵌套的理解,并在第二个循环之前使用e变量,得到UnboundLocalError

顺便说一句,您也可以使用regex来避免这种理解:

^{pr2}$

也不需要拆分线条。在

对于完整的错误(对于error:部分),可以这样做:

re.findall('error:.*', err)

使用具有正常循环的生成器来执行此类需要状态的任务:

def errsplit(err):
    for e in err.splitlines():
        errindex = e.find('error:')
        if errindex > -1: yield e[errindex:]

如果您需要这个列表,只需list(errsplit(err))。在

列表理解并不是真正用来处理存储状态的,尝试在其中使用存储状态可能会很笨拙。在

也就是说,注意regex可能更好,正如@JBernardo所建议的那样。在

相关问题 更多 >