为循环嵌套的单行

2024-04-25 12:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

用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. 什么是相等的不受尊重的循环?

鉴于

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

另外,我们也希望您能提供更多的信息。


Tags: 对象函数inforlenreturn顺序过程
3条回答

最好的信息来源是official Python tutorial on list comprehensions。列表理解与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循环的最后一部分(你在哪里做某事)在开始而不是结束。

关于你的问题:

What type must object be in order to use this for loop structure?

一个iterable。可以生成(有限)元素集的任何对象。其中包括任何容器、列表、集合、生成器等

What is the order in which i and j are assigned to elements in object?

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

Can it be simulated by a different for loop structure?

是的,上面已经显示了。

Can this for loop be nested with a similar or different structure for loop? And how would it look?

当然,但这不是个好主意。例如,这里提供了一个字符列表:

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

您可能对^{}感兴趣,它从您传递给它的所有iterable返回一个iterable产生的值元组。也就是说,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)]

这张照片:

[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循环,而是使用list comprehension

  1. 相当于

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

  2. 与此基本相同,它通常像for循环那样从右向左嵌套。但是列表理解语法更复杂。

  3. 我不确定这个问题在问什么


  1. 任何产生正好产生两个对象的iterable对象的iterable对象(一口一口的-即[(1,2),'ab']将是有效的)

  2. 迭代时对象产生的顺序。i转到第一个成品,j到第二个成品。

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

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

    或者更好地使用map

    map(function, object)
    

    当然,函数必须得到ij本身。

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

相关问题 更多 >