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

时间:2012-06-26 15:01:15

标签: python

我试图弄清楚一个没有设置结果代码的功能的输出。我可以通过混合到stderr流中的“error:”字符串告诉它失败,通常是在不同的转换状态消息中。

我有以下列表理解可行,但扫描“error:”字符串两次。由于它只是重新扫描实际的错误行,它工作正常,但它让我烦恼我无法弄清楚如何使用单个扫描。这是工作代码:

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

简化(和错误)的简化方法是保存“查找”结果

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

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

感谢。肯特

3 个答案:

答案 0 :(得分:3)

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

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

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

顺便说一句,你也可以使用正则表达式来避免这种理解:

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

也不需要拆分线。

完整错误(error:部分)这有效:

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

答案 1 :(得分:2)

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

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

如果您需要此列表,请执行list(errsplit(err))

列表推导并不是真正用于处理存储状态,并且尝试在其中使用存储状态可能会变得笨拙。

那就是说,正如@JBernardo所建议的那样,正则表达式可能会更好。

答案 2 :(得分:0)

我尝试过JBernardo的解决方案,但真正对我有用的是:

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