Python:复杂列表推导式,其中一个变量依赖于另一个 (x for x in t[1] for t in tests)
我想做一些类似这样的事情:
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
有没有什么简单的方法可以做到这一点?
4 个回答
2
如果你只是想把几个列表加在一起,可以试试内置的sum函数,用[]作为起始值:
all = sum((t[1] for t in tests), [])
5
如果不确定,就不要使用列表推导式。
在你的Python环境中试试输入 import this
,然后看看第二行:
Explicit is better than implicit
这种复杂的列表推导式会让很多Python程序员感到困惑,所以至少加个注释,解释一下你是在去掉字符串并把剩下的列表扁平化。
在列表推导式清晰易懂的情况下可以使用,特别是当它们是常见用法时,也就是因为它们是表达某个意思最有效或优雅的方式时,应该使用它们。例如,这篇关于Python习惯用法的文章给出了以下例子:
result = [3*d.Count for d in data if d.Count > 4]
这个例子清晰、简单、直接。如果你注意格式,嵌套的列表推导式也还不错,或许加个注释会更好,因为大括号可以帮助读者理解表达式。但我认为这个问题的接受解法太复杂,容易让人困惑。它超出了合理的范围,让太多人看不懂代码。最好把至少一个迭代展开成一个for循环。
17
应该反过来这样做:
all = [x for t in tests for x in t[1]]