如果我有一个迭代器it
并且想要耗尽它我可以写:
for x in it:
pass
是否有内置或标准的库调用,允许我在一行中进行?我当然可以这样做:
list(it)
将从迭代器构建一个列表然后丢弃它。但我认为由于列表构建步骤效率低下。为自己编写一个帮助函数来执行空的for循环当然是微不足道的但是如果我还缺少其他东西我很好奇。
答案 0 :(得分:12)
# 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)