8

是否有n从迭代器中删除值的 Pythonic 解决方案?您可以通过丢弃n值来做到这一点,如下所示:

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

但这在 IMO 中并不像 Python 代码那样优雅。我在这里缺少更好的方法吗?

4

3 回答 3

10

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

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)

如果你不需要特殊行为 when nis None,你可以使用

next(islice(iterator, n, n), None)
于 2012-06-20T06:20:40.397 回答
4

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

import itertools
def drop(it, n):
    return itertools.islice(it, n, None)
于 2012-06-20T06:20:48.030 回答
0

可以通过花哨的使用来做到这一点itertools.dropwhile,但我会犹豫以任何方式称之为优雅:

def makepred(n):
   def pred(x):
      pred.count += 1
      return pred.count < n
   pred.count = 0
   return pred

itertools.dropwhile(it, makepred(5))

不过,我真的不推荐这样做——依赖谓词函数的副作用非常奇怪。

于 2012-06-20T06:25:08.740 回答