[英]nested list comprehension using intermediate result
我试图查看没有设置结果代码的功能的输出。 我可以说它由于混合在stderr流中的“错误:”字符串而失败,通常是在不同的转换状态消息中间。
我有下面的列表理解功能,但是扫描了两次“错误:”字符串。 由于它仅重新扫描实际的错误行,因此可以很好地工作,但是让我烦恼的是,我无法弄清楚如何使用单次扫描。 这是工作代码:
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'”。 盲目地将“ for”理解为反向也将失败。 怎么做?
谢谢。 肯特
您可以将'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)
使用具有正常循环的生成器来执行需要状态的此类任务:
def errsplit(err):
for e in err.splitlines():
errindex = e.find('error:')
if errindex > -1: yield e[errindex:]
如果您需要此列表,只需执行list(errsplit(err))
。
列表推导并不是真正用来处理存储状态的,尝试在其中使用存储状态可能会很笨拙。
也就是说,请注意,正则表达式可能会更好,如@JBernardo所建议。
我已经尝试过JBernardo的解决方案,但对我真正有用的是:
[errstr[i:] for i,errstr in
((e.find('error:'), e) for e in err.splitlines())
if i != -1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.