了解嵌套列表内涵

我想了解嵌套列表内涵。 下面,我列出了一个列表内涵表达式和它们的 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)

我在 等效于复杂列表内涵的回路表达式上也问过类似的问题
那里给出的答案在理解了形式在内部的作用之后重建了形式。
我想知道它是如何系统地工作的,这样我就可以把这个概念应用到其他稍有不同的例子中。

80791 次浏览

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

只有一个问题: 通常在 python 代码中使用嵌套列表内涵的方式是操作多维数组。

一个典型的例子是在矩阵上运算:

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

正如您所看到的,“嵌套”是通过操作矩阵的每个维度来实现的。

在您提供的示例中,似乎 ySet[不幸的名称 btw,因为 < a href = “ http://docs.python.org/library/stdtypees.html # set-types-set-Frozenset”rel = “ norefrer”> sets 是 python 提供的类型之一]只是一个通用计数器,这使得有点难以理解底层发生了什么。

至于你的第一个例子:

>>> 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(rows[0], rows[1])
[(1, 10), (2, 20), (3, 30)]

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

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

哈!

事实上,您是正确的。这在 Python 语言参考中的表达式部分中有详细描述。

特别要注意的是,一个列表内涵中几个字符串的嵌套顺序总是从左到右:

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