微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一次迭代 n 个 python 迭代器

如何解决一次迭代 n 个 python 迭代器

我试图一次迭代一堆数据范围,以获得它们所有值的组合。

范围的数量可以不同,但​​我将它们收集在一个列表中。

有没有办法使用列表理解或类似的简洁、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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。