繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM