了解嵌套的列表理解

我想了解嵌套的列表理解。 下面我列出一个列表理解expression式和它们的for循环等价。
我想知道我的理解是否正确。

例如,

[(min([row[i] for row in rows]),max([row[i] for row in rows])) for i in range(len(rows[0]))] 

相当于

 result=[] for i in range(len(rows[0])): innerResult=[] for row in rows: innerResult.append(row[i]) innerResult2=[] for row in rows: innerResult2.append(row[i]) tuple=(min(innerResult), max(innerResult2)) result.append(tuple) 

如果我可以概括,我猜

 [exp2([exp1 for x in xSet]) for y in ySet] 

表格可以翻译成以下内容。 (我希望我对此是正确的)

 result=[] for y in ySet: innerResult =[] for x in xSet: innerResult.append(exp1) exp2Result = exp2(innerResult) result.append(exp2Result) 

为了更简单的情况,

 [exp1 for x in xSet for y in ySet] 

等于

 result=[] for x in xSet: for y in ySet: result.append(exp1) 

然而,

 [[exp1 for x in xSet] for y in ySet] 

等于

 result=[] for y in ySet: innerResult=[] for x in xSet: innerResult.append(exp1) result.append(innerResult) 

对于复杂列表理解,我在等效循环expression式上提出了类似的问题
在那里给出的答案在了解它在内部做了什么之后重新构build了表格。
我想知道它是如何系统地工作,所以我可以将这个概念应用于其他稍微变化的例子。

简短的回答是: 是的,你的理解是正确的

只有一个问题:在Python代码中,通常使用嵌套列表理解的方式是在multidimensional array上运行。

一个典型的例子是当你在matrix上操作时:

 >>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> [[el - 1 for el in row] for row in matrix] [[0, 1, 2], [3, 4, 5], [6, 7, 8]] 

正如你所看到的,“嵌套”通过对matrix的每个维度进行操作。

在你提供的例子中,似乎ySet [不幸的名字顺便说一句,因为集合是python提供的types之一]只是一个通用的计数器,这使得有点难以跟随正在发生的事情。

至于你的第一个例子:

 >>> rows = ([1, 2, 3], [10, 20, 30]) >>> [(min([row[i] for row in rows]),max([row[i] for row in rows])) for i in range(len(rows[0]))] [(1, 10), (2, 20), (3, 30)] 

您可能希望查看zip内置函数:

 >>> zip(rows[0], rows[1]) [(1, 10), (2, 20), (3, 30)] 

或为了最大限度的简洁和优雅:

 >>> zip(*rows) [(1, 10), (2, 20), (3, 30)] 

HTH!

事实上,你是对的。 这在“Python语言参考”的“ expression式”部分有详细描述。

尤其要注意的是,在单个列表理解中,几个s的嵌套顺序总是从左到右:

 >>> matrix = [[1, 2], [3, 4]] >>> [item for item in row for row in matrix] # oops! Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> [item for item in row for row in matrix] NameError: name 'row' is not defined >>> [item for row in matrix for item in row] # nesting is in left-to-right order [1, 2, 3, 4]