关于python:关于嵌套列表理解如何工作的解释?

Explanation of how nested list comprehension works?

我理解这一点没有问题:

1
2
a = [1,2,3,4]
b = [x for x in a]

我以为就这些,但后来我发现了这段话:

1
2
a = [[1,2],[3,4],[5,6]]
b = [x for xs in a for x in xs]

这使得b = [1,2,3,4,5,6]。问题是我很难理解[x for xs in a for x in xs]中的语法,有人能解释它是如何工作的吗?


啊,难以理解的"嵌套"理解。循环展开的顺序与理解的顺序相同。

1
[leaf for branch in tree for leaf in branch]

这样想会有帮助。

1
2
3
for branch in tree:
    for leaf in branch:
        yield leaf

PEP202断言"最后一个变化最快的索引"就是"正确的索引",特别是在没有解释原因的情况下。


如果a = [[1,2],[3,4],[5,6]],那么如果我们展开这个列表组件,我们得到:

1
2
3
4
5
      +----------------a------------------+
      | +--xs---+ , +--xs---+ , +--xs---+ | for xs in a
      | | x , x |   | x , x |   | x , x | | for x in xs
a  =  [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ]
b  =  [ x for xs in a for x in xs ] == [1,2,3,4,5,6] #a list of just the"x"s


b = [x for xs in a for x in xs]与嵌套循环相似。

1
2
3
4
b = []
for xs in a:
   for x in xs:
       b.append(x)

有效地:

1
...for xs in a...]

正在遍历主(外部)列表并依次返回每个子列表。

1
...for x in xs]

然后遍历每个子列表。

这可以重写为:

1
2
3
4
b = []
for xs in a:
    for x in xs:
        b.append(x)

可以这样写

1
2
3
4
result = []
for xs in a:
    for x in xs:
        result.append(x)

你可以在这里了解更多


这是一个嵌套理解的例子。把a = [[1,2],[3,4],[5,6]]想象成一个3乘2的矩阵(matrix=[[1,2],[3,4],[5,6]])。

1
2
3
4
5
6
7
       ______
row 1 |1 | 2 |
       ______
row 2 |3 | 4 |
       ______
row 3 |5 | 6 |
       ______

您所看到的列表理解是另一种将矩阵中的所有元素放入列表的方法。

我将尝试用不同的变量来解释这一点,希望这更有意义。

1
b = [element for row in matrix for element in row]

第一个for循环迭代矩阵ie [1,2],[3,4],[5,6]中的行。第二个for循环迭代2个元素列表中的每个元素。

我在我的网站http://programmathics.com/programming/python/python-list-understruction-tutorial/上写了一篇关于列表理解的小文章,它实际上涵盖了与这个问题非常相似的场景。我还提供了其他一些关于python列表理解的例子和解释。

免责声明:我是那个网站的创建者。


是的,可以在列表理解中嵌套循环。甚至可以在其中嵌套if语句。

1
2
3
4
5
6
7
8
9
10
dice_rolls = []
for roll1 in range(1,7):
    for roll2 in range(1,7):
        for roll3 in range(1,7):
            dice_rolls.append((roll1, roll2, roll3))

# becomes

dice_rolls = [(roll1, roll2, roll3) for roll1 in range(1, 7) for roll2 in range(1, 7)
              for roll3 in range(1, 7)]

我写了一篇关于媒体的短文,解释了清单的理解以及其他一些你可以用Python做的很酷的事情,如果你感兴趣的话,你应该看看:)


列表理解是使用内部for循环生成自己的列表。它们是Python中非常常见的特性,看起来像:

[物品清单中的物品]

好的,很好,但我为什么要用这个?

当您想节省一些空间时,列表理解非常有用。当您只需要快速处理一个列表来对该列表进行一些重复工作时,它们也很方便。如果您了解函数式编程,它们也非常有用,但这是稍后课程的主题(提示提示)。

但是,如果你能做的只是直接通过一个列表,那么列表理解就没有那么有用了。谢天谢地,它们可以在有条件的情况下使用。


B=[X代表X,A代表X,X代表X]与以下相同:

1
2
3
4
b = []
for xs in a:
    for x in xs:
        b.append(x)

为了更好地理解,只需从右到左依次添加for循环,当它创建时,list x就成为list的元素。


1
2
a = [[1,2],[3,4],[5,6]]
b = [x for xs in a for x in xs]

在这里,for xs in a作为外循环执行,for x in xs作为内循环执行。所以,可以这样写

1
2
3
4
b = []
for xs in a:
    for x in xs:
        b.append(x)