我想了解嵌套列表理解。 下面,我列出了一个列表推导表达式和它们的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)
我在Equivalent for loop expression for complex list comprehension上问了一个类似的问题 给出的答案在理解了内部的作用后重建了形式 我想知道它是如何系统地工作的,所以我可以将这个概念应用于其他略有不同的例子。
答案 0 :(得分:71)
确实,你是对的。这在Expressions section in the Python Language Reference。
中有详细描述特别注意在单个列表推导中嵌套几个for
的顺序,它总是从左到右:
>>> 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]
答案 1 :(得分:69)
简短的回答是:是的,您的理解是正确的。
只有一个问题:你通常在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,因为 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内置函数:
>>> zip(rows[0], rows[1])
[(1, 10), (2, 20), (3, 30)]
或最大限度地简洁和优雅:
>>> zip(*rows)
[(1, 10), (2, 20), (3, 30)]
HTH!