在python中,如何将iterable映射到iterable?

时间:2014-04-03 17:14:52

标签: python stream functional-programming iterator iterable

我有一个可迭代的东西 - 也就是响应__iter__的东西,可以在每次使用新的迭代器时懒惰地迭代,多次

我希望映射到另一个 iterable ,它也可以多次迭代,但不会将整个集合带入内存。

map不起作用 - 它返回一个列表,因此将整个数据集放入内存中。

itertools.imap也不起作用 - 它需要可迭代,但会返回一次性迭代器

我正在寻找的是一组类似itertools的组合器,它们在迭代级别上运行。只有在最后阶段,当我消耗最终结果时,我是否需要单次迭代器对象,所以我真的不明白为什么itertools返回它们而不是返回例如某种MappedIterable。

任何指针?或者这在某种程度上是非Pythonic?

1 个答案:

答案 0 :(得分:0)

itertools相当简单,它主要(完全?)根据其输入的可迭代/乘法可迭代/序列来做不同的事情。 imap并不知道或关心您已将其传递给发生而不是迭代器的迭代。

class MyMap(object):
    def __init__(self, func, *iterables):
        self.func = func
        self.iterables = iterables
    def __iter__(self):
        return iter(itertools.imap(self.func, *self.iterables))

或者那些东西。我还没有测试过它。

自动执行此操作很困难(不可能?),因为Python迭代器协议并不能告诉您迭代是否可以多次迭代。你可以假设,如果iter(i) is i那么它就不能,但我不认为你可以安全地假设iter(i) is not i那么可以

基本上可以迭代多次的迭代(类似于C ++调用ForwardIterator而不仅仅是InputIterator)并不是Python程序员AFAIK通常要求的概念。所以我认为你可能必须为itertools编写自己的包装器。