Python:复杂的列表推导,其中一个var依赖于另一个(测试中t的t为t [1]中的x为x)

Alb*_*ert 8 python list-comprehension

我想做的事情如下:

all = [ x for x in t[1] for t in tests ]
Run Code Online (Sandbox Code Playgroud)

测试看起来像:

[ ("foo",[a,b,c]), ("bar",[d,e,f]) ]
Run Code Online (Sandbox Code Playgroud)

所以我想得到结果

all = [a,b,c,d,e,f]
Run Code Online (Sandbox Code Playgroud)

我的代码不起作用,Python说:

UnboundLocalError: local variable 't' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法呢?

Fer*_*yer 17

它应该反过来:

all = [x for t in tests for x in t[1]]
Run Code Online (Sandbox Code Playgroud)

  • 我认为Python对多个列表推导的顺序的选择是一个错误.我理解它试图复制嵌套for语句的使用但我发现结果不可读并且倾向于避免它. (17认同)

Mic*_*lon 5

如有疑问,请勿使用列表推导.

尝试import this使用Python shell并阅读第二行:

Explicit is better than implicit
Run Code Online (Sandbox Code Playgroud)

这种类型的列表推导复合将困扰很多Python程序员,所以至少添加一个注释来解释你正在删除字符串并展平剩余的列表.

使用清单易于理解的列表推导,尤其是在惯用时使用它们,即通常使用它们,因为它们是表达某些内容的最有效或最优雅的方式.例如,这篇Python Idioms文章给出了以下示例:

result = [3*d.Count for d in data if d.Count > 4]
Run Code Online (Sandbox Code Playgroud)

它清晰,简单,直接.如果你注意格式化,嵌套列表理解也不算太糟糕,也许添加一个注释,因为大括号可以帮助读者分解表达式.但在我看来,这个问题被接受的解决方案过于复杂和令人困惑.它超越了界限,使得代码对于太多人来说是不可读的.最好将至少一次迭代展开到for循环中.