【问题标题】:Next level of abstraction up from a for loop?从 for 循环开始的下一级抽象?
【发布时间】:2015-04-05 19:45:35
【问题描述】:

使用 Python 工作,但正在寻找一般结构。

我有一个函数,它将长度为 L 的数组作为输入(例如,[0,0,0,...,0] 和 L 个半正元素)。输入数组的每个元素都有一个正的最大值,例如,我有一个长度为 L 的数组,max_vals = [10,5,4,...,7]。我想遍历函数的所有可能输入。

使用“广义计数”可以很容易地做到这一点,但我想知道是否有更优雅的方式来做到这一点。具体来说,我想要一些结构,例如:

meta_for vector in meta_range(max_vals):
    relevant_function( vector )

这在功能上等同于:

for i_1 in range(max_vals[0]):
    for i_2 in range(max_vals[1]):
        ...
            for i_L in range(max_vals[L-1]):
                relevant_function( [i_1, i_2, ..., i_L] )

困难在于嵌套for循环的数量取决于L,因此不能硬编码。

这样的事情存在吗?

【问题讨论】:

  • 听起来您正在寻找计算power set
  • 是的。简单的方法是递归。
  • 你能举一个输入和期望输出的例子吗?
  • @MattBall,我很难看出它们是如何相同的。我不是要迭代许多不同长度的向量,只是要迭代具有一般长度的向量。

标签: python algorithm loops nested-loops


【解决方案1】:

您可以使用itertools.product

import itertools
max_vals = [3, 2]
for I in itertools.product(*[range(m) for m in max_vals]):
    print I

打印

(0, 0)
(0, 1)
(1, 0)
(1, 1)
(2, 0)
(2, 1)

【讨论】:

  • 谢谢!这正是我一直在寻找的。我真的需要坐下来阅读 itertools 文档;看起来该模块确实应该融入基础语言。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2013-06-22
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2019-12-25
  • 2012-12-12
相关资源
最近更新 更多