【问题标题】:In python, how do I map an iterable to an iterable?在 python 中,如何将可迭代对象映射到可迭代对象?
【发布时间】:2014-04-03 17:14:51
【问题描述】:

我有一个可迭代的——即响应 __iter__ 并且可以懒惰地迭代的东西,多次每次使用一个新的新迭代器。

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

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

itertools.imap 也不起作用——它需要一个 iterable 但返回一个一次性 iterator

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

指点任何人?或者这在某种程度上是异端的非 Pythonic?

【问题讨论】:

  • 生成器表达式有什么问题?还是itertools.izip()?这在很大程度上取决于您真正想要对这些值做什么
  • 完全不清楚您希望对您的两个迭代器进行什么样的处理。
  • 生成器表达式是一次性对象,而不是可迭代的集合。
  • 你能把你懒惰的、多次迭代的代码贴出来吗?一个可能的用例以及预期和观察到的行为?
  • iter(youriterable) 也是一次性迭代器。所有迭代器都是一次性的,这是根据定义。

标签: python stream functional-programming iterator iterable


【解决方案1】:

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 编写自己的包装器。

【讨论】:

  • __iter__ 方法中不需要iter();通常__iter__iter() 调用。
  • 谢谢——是的,这就是我想要的,我想我希望可能有一个类似itertools 的组合器库,它在人们已经标准化的地方像这样工作。我猜不是。
  • @MartijnPieters:是的,因为itertools.imap 已经返回了一个迭代器。这实际上只是一种习惯,如果我正在编写一个委托给其他东西的__iter__ 函数,无论是否需要,我都会在其中调用iter(),以便“证明”我正在返回一个迭代器。在制定该策略之前,我有时会在需要时不小心将其遗漏并返回一个可迭代对象。有可能我现在足够聪明,不需要这项政策,但我什么都不保证。
  • @Matt: 好吧,给它半个多小时才得出结论没有,但是根据过去的表现,如果 Martijn 不知道它,那么它不可能非常 常用。我对 Python 的使用/知识不是很具有社区意识,所以我的回答中的“AFAIK”是“我之前模糊地搜索过这个区别但没有找到它”。
  • 接受这个。作为记录,当您编写从大型数据集学习的多遍算法时,“可以多次迭代的迭代”是一个非常有用的概念。我想对于大多数 Python 用途来说,将它放入内存是可以接受的,所以它不是优先事项。如果我需要更多次,我可能会制作一个反映itertools 并返回可迭代对象的小库。干杯
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 2019-06-03
  • 2013-08-03
  • 2019-08-15
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多