我有一个可迭代的东西 - 也就是响应__iter__
的东西,可以在每次使用新的迭代器时懒惰地迭代,多次。
我希望将映射到另一个 iterable ,它也可以多次迭代,但不会将整个集合带入内存。
map
不起作用 - 它返回一个列表,因此将整个数据集放入内存中。
itertools.imap
也不起作用 - 它需要可迭代,但会返回一次性迭代器。
我正在寻找的是一组类似itertools的组合器,它们在迭代级别上运行。只有在最后阶段,当我消耗最终结果时,我是否需要单次迭代器对象,所以我真的不明白为什么itertools
返回它们而不是返回例如某种MappedIterable。
任何指针?或者这在某种程度上是非Pythonic?
答案 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编写自己的包装器。