单行嵌套循环
在python中编写了一个转置matrix的函数:
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循环是如何执行的。 请通过回答以下问题来帮助我理解:
- 循环执行的顺序是什么?
- 如果我有一个三重嵌套for循环,它会执行什么命令?
- 什么会等于相等的unnesnes for循环?
鉴于,
[ function(i,j) for i,j in object ]
- 为了使用这个循环结构,必须使用什么types的对象?
- i和j被分配给对象中的元素的顺序是什么?
- 它可以通过不同的循环结构来模拟吗?
- 这个for循环可以嵌套一个类似或不同的循环结构吗? 它看起来如何?
其他信息,以及赞赏。
最好的信息来源是关于列表parsing的官方Python教程 。 列表推导与循环几乎相同(当然,任何列表理解都可以写成for循环),但是它们通常比使用for循环要快。
从教程中查看这个较长的列表理解( if
部分过滤理解,只有通过if语句的部分被传递到列表理解的最后部分(here (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
它和嵌套for循环完全一样(正如本教程所述,请注意for和if的顺序是如何相同的)。
>>> combs = [] >>> for x in [1,2,3]: ... for y in [3,1,4]: ... if x != y: ... combs.append((x, y)) ... >>> combs [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
列表理解和for循环之间的主要区别在于for循环的最后部分(在哪里做什么)在开始处而不是在结尾处。
在你的问题上:
为了使用这个循环结构,必须使用什么types的对象?
一个可迭代的 。 任何可以生成(有限)一组元素的对象。 这些包括任何容器,列表,组,发电机等。
i和j被分配给对象中的元素的顺序是什么?
它们的分配顺序与它们从每个列表中生成的顺序完全相同,就好像它们是嵌套for循环一样(为了你的第一个理解,你会得到1个元素,然后每个j值,第二个元素到i,那么来自j的每个值等)
它可以通过不同的循环结构来模拟吗?
是的,已经在上面显示了。
这个for循环可以嵌套一个类似或不同的循环结构吗? 它看起来如何?
当然,但这不是一个好主意。 在这里,例如,给你一个字符列表的列表:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]
您可能会对itertools.product
感兴趣,它将从您传递的所有迭代中返回一个可迭代的元组值。 也就是说, itertools.product(A, B)
产生表格(a, b)
所有值,其中a
值来自A
, b
值来自B
例如:
import itertools A = [50, 60, 70] B = [0.1, 0.2, 0.3, 0.4] print [a + b for a, b in itertools.product(A, B)]
这打印:
[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4]
注意传递给itertools.product
的最后一个参数是“内部”的。 一般来说, itertools.product(a 0 , a 1 , ... a n )
等于[(i 0 , i 1 , ... i n ) for i n in a n for i n-1 in a n-1 ... for i 0 in a 0 ]
itertools.product(a 0 , a 1 , ... a n )
[(i 0 , i 1 , ... i n ) for i n in a n for i n-1 in a n-1 ... for i 0 in a 0 ]
首先,你的第一个代码本身不使用for循环,而是使用列表理解 。
-
将相当于
对于范围(0,宽度)中的j:对于范围(0,高度)中的i:m [i] [j]
-
大致相同的方式,它通常嵌套像循环,从右到左。 但是列表理解的语法比较复杂。
-
我不确定这个问题在问什么
-
任何可迭代的对象,产生可精确产生两个对象的可迭代对象(多么满意 – 即
[(1,2),'ab']
是有效的) -
对象在迭代时产生的顺序。
i
去第一个产量,第二个。 -
是的,但不是很漂亮。 我相信这在function上等同于:
l = list() 对于i,j的对象: l.append(function(I,J))
甚至更好的使用地图 :
map(function, object)
但是当然,函数必须得到
i
,j
本身。 -
这不是和3一样的问题吗?
- 由于rc.exe,Visual Studio无法生成
- IntelliSense不适用于Visual Studio 2012中的JavaScript
- “mscorlib.pdb未加载”,但mscorlib.dll不会丢失
- 智能感知和代码build议不能在Visual Studio 2012 Ultimate RC中工作
- Visual Studio 2012将无法启动
- 服务器在vs2012太忙
- Javascript:如何dynamic地使用数组给定的对象名创build嵌套对象
- 对Windows 8 Metro JavaScript App使用jQuery导致安全错误
- 如何sortingOrderedDict OrderedDict – Python