可变数量嵌套循环的迭代器

4
我正在尝试为类似以下内容(从原问题简化而来)编写迭代器:
import numpy as np

class IterableNumber:
  def __init__(self, digits):
    self.digits = digits
    self.zero_indices = np.where(digits == 0)[0]
  def __iter__(self):
    return self
  def next(self):
    # For each index in self.zero_indices, loop 1 through 9?
    pass
  # Other methods omitted

IterableNumber接受一个数字数组,但数字'0'表示通配符。当我遍历此对象时,我希望每个'0'位数循环1到9的范围,即

num = IterableNumber(np.array([5, 5, 0, 5, 0]))
for digits in num:
  print digits

应该打印

[5, 5, 1, 5, 1]
[5, 5, 1, 5, 2]
...
[5, 5, 1, 5, 9]
[5, 5, 2, 5, 1]
[5, 5, 2, 5, 2]
...
...
[5, 5, 9, 5, 9]

针对一般情况编写此迭代器似乎需要递归来处理嵌套循环的可变数量(每个0都对应一个循环),就像本站上的其他帖子建议的那样。但是,在next()函数的上下文中如何编写这样的递归函数呢?或者也许有另一种解决这个问题的方法?任何见解都将不胜感激:)

如果相关,则我使用的是Python 2.7.3。

1个回答

3
您可以使用 itertools.product 来实现此功能:
import numpy as np

from itertools import product

class IterableNumber:
    def __init__(self, digits):
        self.digits = digits
        self.zero_indices = np.where(self.digits==0)[0]
        self.length = len(self.zero_indices)

    def __iter__(self):
        for x in product(range(10), repeat=self.length):
            self.digits[self.zero_indices] = np.array(x)
            yield self.digits

演示:

>>> for x in IterableNumber(np.array([5, 5, 0, 5, 0])):
    print x
...     
[5 5 0 5 0]
[5 5 0 5 1]
[5 5 0 5 2]
[5 5 0 5 3]
[5 5 0 5 4]
[5 5 0 5 5]
[5 5 0 5 6]
[5 5 0 5 7]
[5 5 0 5 8]
[5 5 0 5 9]
...
...
[5 5 9 5 3]
[5 5 9 5 4]
[5 5 9 5 5]
[5 5 9 5 6]
[5 5 9 5 7]
[5 5 9 5 8]
[5 5 9 5 9]
>>> 

非常感谢您的快速回复!这实际上对我目前需要的一切都有效,但是我想为了自己的丰富(以及以防将来需要做类似的事情),如果我需要以不同的方式迭代一些索引,itertools.product是否可以推广?一个愚蠢的例子是,所有偶数索引我想要range(0, 10, 2),而所有奇数索引则是range(10) - xph
@xph 抱歉我没有理解你的例子,能否详细说明一下。;-) - Ashwini Chaudhary
假设输入是 [5, 0, 0],我希望输出为: [5, 0, 0] [5, 0, 2] ... [5, 0, 8] [5, 1, 0] ... [5, 2, 0] ... - xph
@xph 我认为你需要更多的东西,而不仅仅是简单的“product”。 - Ashwini Chaudhary
我也有同样的想法。嗯,你的解决方案能够满足我的需求,所以我会标记它,谢谢! - xph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接