【问题标题】:summing nested iterables with map-reduce/itertools使用 map-reduce/itertools 对嵌套迭代求和
【发布时间】:2018-05-15 09:27:22
【问题描述】:

我已经被这个数据结构困住了一段时间了:

iter([iter([1,0]),iter([1,1]),iter([0,0])])

我想使用 map-reduce/itertools 对最里面的元素求和。

我能够使用 for 循环相当快地得到答案:

outer_iter = iter([iter([1,0]),iter([1,1]),iter([0,0])])

for inner_iter in outer_iter:
    for inner_list in inner_iter:
        total = total + inner_list

我正在努力“翻译”代码。

【问题讨论】:

  • iterables 可以嵌套 任意 深度,还是只有两层?

标签: python python-3.x functional-programming mapreduce itertools


【解决方案1】:

如果数据嵌套两层深,我们可以使用chain函数将iterables连接在一起,然后让sum(..)计算iterable的总和。所以:

from itertools import chain

sum(chain.from_iterable(outer_iter))

chain.from_iterable 将一个可迭代对象作为输入,并将其转换为一个可迭代对象,该可迭代对象一次懒惰地从可迭代对象中获取元素。我们可以在chain 上使用可迭代解包,但如果外部可迭代是一个无限列表,算法会卡住(并最终耗尽内存)。

【讨论】:

  • 我在玩这段代码时注意到的一点:stackoverflow.com/questions/29403401/…
  • @lainglo:是的,迭代器确实被消耗了。但实际上没有办法不消耗迭代器。您可以使用tee 等,这将产生两个迭代器(通过使用共享内存)
【解决方案2】:

这是一个 int 的迭代器的迭代器。

  1. 展平以获得 int 的迭代器
  2. 对这个迭代器求和

我们可以为此使用Pyterator(免责声明:我是作者)。

from pyterator import iterate

iterate(outer_iter).flatten().sum()

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 2015-02-03
    • 2022-12-20
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多