强制迭代所有迭代

时间:2014-01-18 22:22:04

标签: python python-3.x iterator iteration

我使用map编写了一个for循环,其函数具有副作用。这是我的意思的最小工作示例:

def someFunc(t):
    n, d = t
    d[n] = str(n)

def main():
    d = {}
    map(somefunc, ((i,d) for i in range(10**3)))
    print(len(d))

很明显,映射到1000以下的非负数的someFunc具有填充字典的副作用,后来用于其他字典。

现在,考虑到构造上述代码的方式,print(len(d))的预期输出为0,因为map返回迭代器,而不是列表(与python2不同)。 X)。因此,如果我真的想看到应用于d的更改,那么我将不得不迭代该地图对象直到完成。我能做到的一种方法是:

d = {}
for i in map(somefunc, ((i,d) for i in range(10**3))):
    pass

但这似乎并不优雅。我可以在地图对象上调用list,但这需要O(n)内存,这是低效的。有没有办法强制对地图对象进行完整的迭代?

1 个答案:

答案 0 :(得分:1)

您不想这样做(仅针对副作用运行map()),但此处适用itertools consume recipe

from collections import deque

deque(map(somefunc, ((i,d) for i in range(10**3))), maxlen=0)

配置为最大大小为0的collections.deque() object使用map() iterable而不使用额外的内存。对于此用例,deque对象为specifically optimized