Python:复杂列表推导式,其中一个变量依赖于另一个 (x for x in t[1] for t in tests)

8 投票
4 回答
8645 浏览
提问于 2025-04-15 15:48

我想做一些类似这样的事情:

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]]

撰写回答