嵌套列表理解/合并嵌套列表

时间:2014-05-26 21:36:16

标签: python list-comprehension

我在理解嵌套列表理解结构时遇到了问题。

我有一个清单

>>> 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一样?非常感谢你的帮助!

4 个答案:

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