我在理解嵌套列表理解结构时遇到了问题。
我有一个清单
>>> test
[[1, 2, 3], [4, 5], [6, 7, 8]]
如果我这样做
t2=[]
for x in test:
for y in x:
t2.append(y)
然后它返回
>>> t2
[1, 2, 3, 4, 5, 6, 7, 8]
这正是我想要的。但为什么我不能做
t3=[y for y in x for x in test]
这给了我
>>> t3
[6, 6, 6, 7, 7, 7, 8, 8, 8]
有人可以向我解释为什么t3和t2不一样吗?我怎么写一个列表理解表达式给我和t2一样?非常感谢你的帮助!
答案 0 :(得分:3)
列表推导中的for ... in ...
子句需要按照与正常for循环相同的顺序进行:
>>> test = [[1, 2, 3], [4, 5], [6, 7, 8]]
>>> t3 = [y for x in test for y in x]
>>> t3
[1, 2, 3, 4, 5, 6, 7, 8]
>>>
答案 1 :(得分:1)
在您的代码中,在开始之前,x = [6, 7, 8]
来自您之前的循环(由jonsharpe指出)。
因此,它如此展开:
for y in x:
for x in test:
t3.append(y)
第一个循环中的 x
指向[6, 7, 8]
,稍后会重新分配,但这不会更改第一个循环中使用的引用。如果第二个x
具有不同的名称,结果将是相同的。
答案 2 :(得分:0)
您需要撤消for
循环:
t3 = [y for x in test for y in x]
否则(如果您之前未运行多行版本!)x
未定义。你的代码只是在侥幸的情况下运行 - x
仍然是前一个for
循环结束时的结果,因此是你的结果。
答案 3 :(得分:0)
确保您了解itertools chain:
>>> test=[[1, 2, 3], [4, 5], [6, 7, 8]]
>>> from itertools import chain
>>> list(chain(*test))
[1, 2, 3, 4, 5, 6, 7, 8]