Pythonic解决方案从迭代器​​中删除N值

时间:2012-06-20 06:15:35

标签: python iterator

是否存在从迭代器中删除n值的pythonic解决方案?您可以通过丢弃n值来执行此操作,如下所示:

def _drop(it, n):
    for _ in xrange(n):
        it.next()

但这是IMO不如Python代码那么优雅。我在这里找不到更好的方法吗?

3 个答案:

答案 0 :(得分:8)

我相信你正在寻找“消费”食谱

http://docs.python.org/library/itertools.html#recipes

def consume(iterator, n):
    "Advance the iterator n-steps ahead. If n is none, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

如果nNone时您不需要特殊行为, 你可以使用

next(islice(iterator, n, n), None)

答案 1 :(得分:4)

您可以创建一个从元素n开始的迭代切片:

import itertools
def drop(it, n):
    return itertools.islice(it, n, None)

答案 2 :(得分:0)

itertools.dropwhile

我真的不建议这样做 - 依赖于谓词函数的副作用非常奇怪。