python - 下标 itertools.repeat

标签 python python-3.x python-itertools

鉴于 range 对象已可订阅,为什么 itertools.repeat 对象不可订阅?

In [10]: range(3, 10)[3]
Out[10]: 6

In [11]: import itertools as it

In [12]: it.repeat(5)[3]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-1ef74480e0a7> in <module>()
----> 1 it.repeat(5)[3]

TypeError: 'itertools.repeat' object is not subscriptable

请注意,range 对象和 itertools.repeat 对象是 Python 3 的一部分。

我更喜欢:

class repeat_(itertools.repeat):
    def __init__(self, object_, times=None):
        super().__init__(object_, times)

        self.object_ = object_
        self.times = times

    def __reversed__(self):
        return self

    def __getitem__(self, key):
        return self.object_

    def __contains__(self, key):
        return key == self.object_

    def __len__(self):
        if self.times is None:
            raise ValueError
        return self.times

最佳答案

repeat 只是一遍又一遍地产生相同的对象。我不太确定下标实际上会为您做什么...您也可以调用 next(repeat_object)。也许您正在考虑cycle(就像我最初阅读您的问题时所做的那样)?

itertools 的神奇之处在于它尝试尽可能地延迟操作。鉴于此,如果将生成器表达式传递给 itertools.cycle,您预计会发生什么? cycle 无法知道您传递的对象的长度,除非将整个对象转换为元组并进行查询。这样做可能会在许多其他地方破坏 API(现在,当您为重复对象添加下标时,您会消耗可迭代对象),或者会通过不必要的 itertools.tee 占用更多的中间存储空间 - - 这是 itertools 试图避免的。正如目前实现的那样,在一个巨大的生成器表达式上循环,您不能希望将其保存在内存中(只要您实际上不迭代所有元素),但这不会如果您尝试在大索引处对其进行下标,则情况并非如此。

最后,顾名思义,itertools 是一个用于创建可迭代对象的库。因此,没有理由期望这些对象是可订阅的。 (它毕竟不叫 subscripttools :)。

顺便说一句,您也许可以使用 itertools.islice 执行您想要的操作。

关于python - 下标 itertools.repeat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532671/

相关文章:

python - 在列表中查找递增数字组

python - 根据收到的字典信息动态写入文本文件

python - 如何使用python计算Delta F/F?

python-3.x - 如何在Elasticsearch中计算每个 token 的总数

python - 迭代工具 : creating a 2d iterator

python - 通过python中出现零来选择列表中的元素

Python 闭包困惑

python - 对 pandas 数据框切片进行排序的正确方法

python - 在 csv 文件中查找每个月的最高温度?

python - 为什么 Python 的 sorted() 方法不会反转字典中具有相同值的键的顺序?