如何有效地排出oneliner中的迭代器?

时间:2016-04-21 07:47:06

标签: python

如果我有一个迭代器it并且想要耗尽它我可以写:

for x in it:
    pass

是否有内置或标准的库调用,允许我在一行中进行?我当然可以这样做:

list(it)

将从迭代器构建一个列表然后丢弃它。但我认为由于列表构建步骤效率低下。为自己编写一个帮助函数来执行空的for循环当然是微不足道的但是如果我还缺少其他东西我很好奇。

5 个答案:

答案 0 :(得分:12)

来自itertools recipes

    # feed the entire iterator into a zero-length deque
    collections.deque(iterator, maxlen=0)

答案 1 :(得分:1)

您可以使用sum

sum(0 for _ in it)

或类似地,使用reduce

reduce(lambda x, y: y, it)

答案 2 :(得分:1)

object() in it

如果您知道迭代器永远不会产生某种对象,您也可以使用它,例如None in it() in it。新创建的object()几乎普遍适用,因为它永远不会测试其他任何东西(禁止恶作剧)。

我不是提倡这个成语;问题中的for循环在很多方面都是最佳解决方案。但是,如果你正在寻找一个令人毛骨悚然的“优雅”答案,因为它做了最小可能的边计算,同时仍然是一个非常简洁的单行(而不是像any(False for _ in it))那么这可能是它

答案 3 :(得分:0)

请注意,您的建议也可以表述为单行:

for _ in it: pass

我刚刚做了:

def exhaust(it):
    for _ in it:
        pass

它的速度不及deque解决方案(在我的笔记本电脑上慢10%),但我发现它更干净。

答案 4 :(得分:-1)

内置的all()函数应该非常便宜和简单:

all(True for _ in it)

编辑:已修复,谢谢@hemflit!