【问题标题】:How to traverse a high-order range in Python? [duplicate]如何在 Python 中遍历高阶范围? [复制]
【发布时间】:2019-11-06 18:22:46
【问题描述】:

在python中,我们可以使用range(x)0遍历到x-1。但是如果我想遍历一个高阶范围怎么办?例如,给定(a, b),我想遍历所有(x1, x2),使得0 <= x1 < a, 0<= x2 < b。如果维度是固定的,那么很容易,说它是k维(在我给出的示例中,k是2),那么我们可以简单地硬编码k个循环来实现它,但是当维度也是一个变量时呢?有什么优雅的pythonic方式来处理这个吗?

【问题讨论】:

  • 看看itertools 模块,我敢打赌它有这样的功能。
  • 嵌套 for 循环? for i in range(x1): for j in range(x2):...
  • @BrianJoseph 只有在事先知道 for 循环的数量时,才能编写嵌套的 for 循环。但是正如我所提到的,当维度是变量时,您将无法编写 for 循环。
  • 这里的“维度”是什么意思?你能展示一个更充实的代码示例来说明吗?
  • @YuGu 啊我明白了,所以你需要的嵌套循环的数量是可变的。在那种情况下, itertools.product 是喜欢 kaya 的回答建议的方式

标签: python python-3.x


【解决方案1】:

使用itertools.product:

from itertools import product

for x, y, z in product(range(a), range(b), range(c)):
    print( (x,y,z) )

具有可变数量的维度:

limits = [5, 3, 7, 6]

for v in product(*(range(n) for n in limits)):
    print(v)

【讨论】:

  • @YuGu 请注意,您也可以使用嵌套的 for 循环来完成此操作。使用哪个取决于你对生成的元组做什么。
  • 嵌套的for 循环将在维数不可变时起作用,但在可变情况下则不起作用。另请注意,如果您需要break,如果您不使用嵌套循环会容易得多。
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多