了解嵌套的列表理解
我想了解嵌套的列表理解。 下面我列出一个列表理解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]