问题描述
我试图一次迭代一堆数据范围,以获得它们所有值的组合。
有没有办法使用列表理解或类似的简洁、pythonic 方式来迭代它们?
这就是我所说的一起迭代的意思:
[print(i,j) for i in r1 for j in r2]
这是一个有两个已知范围的简单示例,但我需要的是更像
[print(i,j,...) for i in r1 for j in r2 for k in r3...]
注意:我不只是需要一个数字组合列表,迭代器是我自己的迭代器类,它的工作方式与 range()
类似,但也允许我在不调用 next()
的情况下获得当前状态,它会改变状态。
我的迭代器类将它的值设置回 stopiteration 的开始,因此它可以循环不止一次。
在这里你可以看到课程:
@dataclass
class Range:
start: float
end: float
step: float = field(default=1)
includeEnd: bool = field(default=True)
def __post_init__(self):
self.value = self.start
def __next__(self):
v = self.value
end = v > self.end if self.includeEnd else v >= self.end
if not end:
self.value += self.step
return v
else:
self.value = self.start
raise stopiteration
def __iter__(self):
return self
解决方法
但是,当您有 n 个迭代器的列表时,如何使用 itertools.product() 获得 n 个迭代器的乘积?
itertools.product(*the_list)
。那里的 product()
没有什么特别之处。前导 *
是通用 Python 语法,用于将列表(更一般地,可迭代对象)视为一系列单独的参数。
>>> from itertools import product
>>> args = [range(2),range(3),(i**2 for i in [5,9])]
>>> args
[range(0,2),range(0,3),<generator object <genexpr> at 0x000001E2E7A710B0>]
>>> for x in product(*args):
... print(x)
(0,25)
(0,81)
(0,1,2,81)
(1,25)
(1,81)