我想做类似的事情:
all = [ x for x in t[1] for t in tests ]
测试看起来像:
[ ("foo",[a,b,c]), ("bar",[d,e,f]) ]
所以我想得到结果
all = [a,b,c,d,e,f]
我的代码不起作用,Python说:
UnboundLocalError: local variable 't' referenced before assignment
有没有简单的方法呢?
答案 0 :(得分:17)
它应该相反:
all = [x for t in tests for x in t[1]]
答案 1 :(得分:5)
如有疑问,请勿使用列表推导。
在Python shell中尝试import this
并阅读第二行:
Explicit is better than implicit
这种类型的列表推导复合将困扰很多Python程序员,所以至少添加一个注释来解释你正在删除字符串并展平剩余的列表。
使用清单易于理解的列表推导,尤其是在惯用时使用它们,即通常使用它们,因为它们是表达某些内容的最有效或最优雅的方式。例如,this Python Idioms article给出了以下示例:
result = [3*d.Count for d in data if d.Count > 4]
清楚,简单,直接。如果你注意格式化,嵌套列表理解也不算太糟糕,也许添加一个注释,因为大括号可以帮助读者分解表达式。但在我看来,这个问题被接受的解决方案过于复杂和令人困惑。它超越了界限,使得代码对于太多人来说是不可读的。最好将至少一次迭代展开到for循环中。
答案 2 :(得分:2)
如果您正在做的是将一些列表添加到一起,请尝试使用[]作为起始值的内置和:
all = sum((t[1] for t in tests), [])
答案 3 :(得分:1)
这看起来像是对我的减少。不幸的是,Python没有为reduce提供任何语法糖,所以我们必须使用lambda:
reduce(lambda x, y: x+y[1], tests, [])