列表理解如何工作的解释?

我没有理解这个问题:

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

我以为这是全部,但后来我发现这个片段:

 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]的语法,任何人都可以解释它是如何工作的?

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

 [leaf for branch in tree for leaf in branch] 

这有助于我们这样想。

 for branch in tree: for leaf in branch: yield leaf 

PEP202断言这个语法的“最后一个索引变化最快”是“正确的”,特别是没有解释为什么

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

  +----------------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]类似于下面的嵌套循环。

 b = [] for xs in a: for x in xs: b.append(x) 

有效:

 ...for xs in a...] 

正在迭代你的main(外部)列表,并依次返回你的每个子列表。

 ...for x in xs] 

然后迭代这些子列表中的每一个。

这可以被重写为:

 b = [] for xs in a: for x in xs: b.append(x) 

它可以这样写

 result = [] for xs in a: for x in xs: result.append(x) 

你可以在这里阅读更多

这是一个嵌套理解的例子。 将a = [[1,2],[3,4],[5,6]]看作是一个3乘2的matrix(matrix= [[1,2],[3,4],[5,6] ])。

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

你所看到的列表理解是另一种从matrix中获取所有元素的方法。

我将尝试使用不同的variables来解释这个问题,这将有希望变得更有意义。

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

第一个for循环遍历matrix内的行,即[1,2],[3,4],[5,6] 。 第二个for循环遍历2个元素列表中的每个元素。

我在我的网站http://programmathics.com/programming/python/python-list-comprehension-tutorial/上写了一篇关于List Comprehension的小文章,其中涵盖了与这个问题非常相似的场景。 我还给出了一些Python列表理解的例子和解释。

免责声明:我是该网站的创build者。

b = [x for xs in x for xs]与[

 b = [] for xs in a: for x in xs: b.append(x) 

为了更好的理解,只需从右到左,依次添加for循环,并创build列表x成为列表的元素。