单线嵌套循环

在 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 循环中的单行是如何执行的。请通过回答以下问题来帮助我理解:

  1. For 循环的执行顺序是什么?
  2. 如果我有一个三重嵌套的 for 循环,它会执行什么顺序?
  3. 等于非嵌套 for 循环的是什么?

鉴于,

[ function(i,j) for i,j in object ]
  1. 为了使用这个 for 循环结构,必须使用什么类型的对象?
  2. I 和 j 分配给 object 中元素的顺序是什么?
  3. 可以用不同的 for 循环结构来模拟吗?
  4. 这个 for 循环可以嵌套一个相似或不同的循环结构吗? 它看起来怎么样?

我们也希望得到更多的信息。

328787 次浏览

最好的信息来源是 关于列表理解的官方 Python 教程。列表理解与 for 循环几乎相同(当然任何列表内涵都可以写成 for 循环) ,但它们通常比使用 for 循环更快。

看看这个教程中更长的列表内涵(if部分过滤理解,只有通过 if 语句的部分被传递到列表内涵的最后部分(这里是 (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 循环的最后一部分(你做某事的地方)出现在开头而不是结尾。

接下来是你们的问题:

为了使用这个 for 循环结构,必须使用什么类型的对象?

任何可以生成(有限)一组元素的对象。这些元素包括任何容器、列表、集合、生成器等。

I 和 j 分配给 object 中元素的顺序是什么?

它们被分配的顺序与从每个列表生成的顺序完全相同,就好像它们在一个嵌套的 for 循环中一样(对于你的第一个理解,你会得到 i 的1个元素,然后是 j 的每个值,第二个元素到 i 的每个值,然后是 j 的每个值,等等)

可以用不同的 for 循环结构来模拟吗?

是的,已经在上面显示了。

这个 for 循环可以嵌套一个相似或不同的循环结构吗? 它看起来怎么样?

当然,但这不是一个好主意。比如,这里给你一个字符列表:

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]

首先,您的第一个代码本身不使用 for 循环,而是使用 列表内涵

  1. 相当于

    对于范围(0,宽度)中的 j: 对于范围(0,高度)内的 i: 米[ i ][ j ]

  2. 同样,它通常像 for 循环一样从右到左嵌套,但是列表内涵语法更复杂。

  3. 我不知道这个问题是什么意思


  1. 任何产生正好两个对象的可迭代对象(什么样的拗口对象,即 [(1,2),'ab']是有效的)

  2. 对象在迭代中产生的顺序。 i到达第一个产出,j到达第二个产出。

  3. 是的,但没那么漂亮。我相信它在功能上等同于:

    l = list()
    for i,j in object:
    l.append(function(i,j))
    

    或者更好地使用 地图:

    map(function, object)
    

    当然,功能必须得到 ij本身。

  4. 这个问题和3不是一样的吗?

您可能对 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(a0, a1, ... an)等于 [(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]

下面是嵌套循环的最佳示例代码,同时使用两个 for 循环,请记住第一个循环的输出是第二个循环的输入。 使用嵌套循环时,循环终止也很重要

for x in range(1, 10, 1):
for y in range(1,x):
print y,
print
OutPut :
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8

通过使用 zip函数,可以在同一行中使用两个 for 循环

密码:

list1 = ['Abbas', 'Ali', 'Usman']
list2 = ['Kamran', 'Asgar', 'Hamza', 'Umer']
list3 = []
for i,j in zip(list1,list2):
list3.append(i)
list3.append(j)
print(list3)

产出:

['Abbas', 'Kamran', 'Ali', 'Asgar', 'Usman', 'Hamza']

因此,通过使用 zip 函数,我们可以使用两个 for 循环,或者在同一行中迭代两个列表。