理解嵌套列表理解

2024-03-29 04:37:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想了解嵌套列表理解。 下面,我列出了一个列表理解表达式及其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
这里给出的答案在理解了它的内部功能后重建了它的形式。
我想知道它是如何系统地工作的,这样我就可以把这个概念应用到其他稍微不同的例子中。


Tags: in列表for表达式resultminmaxrows
2条回答

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

这里只有一个问题:通常在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)]

啊!

的确,你是对的。这在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]

相关问题 更多 >