用python编写的这个函数转换了一个矩阵:
def transpose(m):
height = len(m)
width = len(m[0])
return [ [ m[i][j] for i in range(0, height) ] for j in range(0, width) ]
在这个过程中,我意识到我不完全理解单行嵌套for循环是如何执行的。请通过回答以下问题帮助我理解:
鉴于
[ function(i,j) for i,j in object ]
另外,我们也希望您能提供更多的信息。
最好的信息来源是official Python tutorial on list comprehensions。列表理解与for循环几乎相同(当然任何列表理解都可以写成for循环),但它们通常比for循环快。
看看本教程中这个较长的列表理解(部分
if
过滤理解,只有通过if语句的部分才被传递到列表理解的最后部分(这里是(x,y)
):它与这个嵌套for循环完全相同(正如教程所说,注意for和if的顺序是如何相同的)。
列表理解和for循环之间的主要区别是for循环的最后一部分(你在哪里做某事)在开始而不是结束。
关于你的问题:
一个iterable。可以生成(有限)元素集的任何对象。其中包括任何容器、列表、集合、生成器等
它们的分配顺序与从每个列表生成它们的顺序完全相同,就好像它们在嵌套for循环中一样(对于您的第一个理解,您将得到1个元素代表i,然后是j中的每个值,第二个元素代表i,然后是j中的每个值,等等)
是的,上面已经显示了。
当然,但这不是个好主意。例如,这里提供了一个字符列表:
您可能对^{} 感兴趣,它从您传递给它的所有iterable返回一个iterable产生的值元组。也就是说,
itertools.product(A, B)
产生(a, b)
形式的所有值,其中a
值来自A
,b
值来自B
。例如:这张照片:
注意传递给
itertools.product
的最后一个参数是如何成为“内部”参数的。通常,itertools.product(a0, a1, ... an)
等于[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]
首先,第一个代码本身不使用for循环,而是使用list comprehension。
相当于
对于范围(0,宽度)中的j: 对于范围(0,高度)内的i: m[i][j]
与此基本相同,它通常像for循环那样从右向左嵌套。但是列表理解语法更复杂。
我不确定这个问题在问什么
任何产生正好产生两个对象的iterable对象的iterable对象(一口一口的-即
[(1,2),'ab']
将是有效的)迭代时对象产生的顺序。
i
转到第一个成品,j
到第二个成品。是的,但没有那么漂亮。我认为它在功能上等同于:
或者更好地使用map:
当然,函数必须得到
i
,j
本身。这不是和3号一样的问题吗?
相关问题 更多 >
编程相关推荐