单行嵌套循环

Ash*_*and 93 python loops for-loop nested nested-loops

在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) ]
Run Code Online (Sandbox Code Playgroud)

在这个过程中,我意识到我并不完全理解嵌套for循环的单行是如何执行的.请回答以下问题,帮助我理解:

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

鉴于,

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

其他信息也很受欢迎.

Jef*_*ner 151

最好的信息来源是关于列表推导官方Python教程.列表推导与循环几乎相同(当然任何列表理解都可以写成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)]
Run Code Online (Sandbox Code Playgroud)

它与嵌套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)]
Run Code Online (Sandbox Code Playgroud)

列表理解和for循环之间的主要区别在于for循环的最后部分(你做某事的地方)来自开头而不是结尾.

关于你的问题:

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

一个迭代.任何可以生成(有限)元素集的对象.这些包括任何容器,列表,集合,生成器等.

i和j分配给对象中元素的顺序是什么?

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

可以通过不同的for循环结构进行模拟吗?

是的,已在上面显示.

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

当然,但这不是一个好主意.例如,在这里,您可以获得一系列字符列表:

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]
Run Code Online (Sandbox Code Playgroud)


Lyn*_*ynn 28

您可能感兴趣itertools.product,它会从您传递的所有迭代中返回一个可迭代的值集元组值.也就是说,itertools.product(A, B)产生了形式的所有值(a, b),其中a值来自Ab值来自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)]
Run Code Online (Sandbox Code Playgroud)

这打印:

[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4]
Run Code Online (Sandbox Code Playgroud)

注意传递给最后一个参数的itertools.product是"内部" 参数.一般来说,等于itertools.product(a0, a1, ... an)[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]