Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解嵌套列表理解_Python_Nested_List Comprehension - Fatal编程技术网

Python 理解嵌套列表理解

Python 理解嵌套列表理解,python,nested,list-comprehension,Python,Nested,List Comprehension,我想理解嵌套列表理解。 下面,我列出了一个列表理解表达式及其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: innerRes

我想理解嵌套列表理解。 下面,我列出了一个列表理解表达式及其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]
表格可以翻译为以下内容。(我希望我在这一点上是正确的)

对于更简单的情况

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

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

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

result=[] 
for x in xSet:
  for y in ySet: 
    result.append(exp1)
result=[]
for y in ySet:
  innerResult=[]
  for x in xSet:
    innerResult.append(exp1)
  result.append(innerResult)
我在
这里给出的答案在理解表单的内部功能后重新构建表单。

我想知道它是如何系统地工作的,这样我就可以将这个概念应用到其他略有不同的例子中

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

这里只有一个陷阱:在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
[不幸的名称,顺便说一句,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)]

的确,你是对的。这将在中详细描述

特别注意单个列表中多个的嵌套顺序,该顺序始终为从左到右:

>>> 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,2],[3,4]] >>>[矩阵中行对行的项目]#哎呀! 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 [矩阵中逐行逐项逐项] NameError:未定义名称“行” >>>[行中项目对应矩阵中的行]#嵌套顺序从左到右 [1, 2, 3, 4]
旁注:在您的示例中,您可以使用
cols=zip(*rows)
将行分为列,然后您可以简单地对每列使用
min(col)
max(col)
:对于cols中的c,使用
[(min(c),max(c)]
。或者在一个简短的行中:
[(min(c),max(c))表示zip(*行)中的列]
。如果您编写exp1(x,y)而不仅仅是exp1,这会是真的并提高清晰度吗?我认为这是暗示,但想确定吗?@GreenAsJade好吧,是的,那会有用,exp1应该是表达1我已经看过了链接。事实上,对[item for row for matrix for row for item in row]有解释,但找不到[exp for row for item in row]for row in matrix]格式的解释。我是不是遗漏了这里列出的语法?你没有遗漏任何东西,但那是因为你的例子没有使用任何特殊的语法,它只是两个简单的列表理解!第一个
[exp for item in row]
将创建一个给定行的列表。“外部”列表理解将创建一个列表,其中每个项目都是由“内部”列表comp创建的列表,矩阵中的每一行对应一个。正如你在回答中指出的,顺序很重要。而且,我想知道是否有一个关于图书馆参考的章节,讨论[[列表理解]列表理解]格式的排序。据我所知,文档中没有这样的章节。原因是在列表理解中,为每个项计算的表达式可以是任何有效的Python表达式。在此上下文中,“内部”列表理解与任何其他Python表达式一样。。我是唯一一个对这种排序感到惊讶的人:现在解释一下为什么宏级别(在本例中为矩阵…)出现在嵌套/微观级别(行级别…)之前。。