迭代船长功能

时间:2014-02-05 10:00:41

标签: python string int iterable

目前正在使用Python 3.3。我目前在查找如何编写一个函数时会遇到一些问题,该函数需要一个iterable和一个int作为参数,并从iterable生成值,从第一个开始,跳过int指定的值的数量。

我的代码如下:

def skipping(iterable,n=0):
     _iters = iter(iterable)
     try:
         while True:
             current = next(_iters)
             count = n
             while count != 0:
                 count -= 1
                 current = next(_iters)
             count = n
             yield current
     except StopIteration:
         pass

当我致电skipping('abcdefghijklmnopqrstuvwxyz', 1)时。我得到了.join()

bdfhjlnprtvxz <---- Wrong output

我想得到:

acegikmoqsuwy <---- Right output

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

itertools已经提供了这个:

def skipping(iterable, n=0):
    return itertools.islice(iterable, 0, None, n+1)

该文档还为islice提供了近似等效的Python代码:

def islice(iterable, *args):
    # islice('ABCDEFG', 2) --> A B
    # islice('ABCDEFG', 2, 4) --> C D
    # islice('ABCDEFG', 2, None) --> C D E F G
    # islice('ABCDEFG', 0, None, 2) --> A C E G
    s = slice(*args)
    it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or 1))
    nexti = next(it)
    for i, element in enumerate(iterable):
        if i == nexti:
            yield element
            nexti = next(it)

你的代码中的错误是你跳过,收益,跳过,收益而不是收益,跳过,收益,跳过。在开始跳过元素之前,您需要首先生成一个元素:

def skipping(iterable,n=0):
     iterable = iter(iterable)
     try:
         while True:
             yield next(iterable)
             for _ in xrange(n):
                 next(iterable)
     except StopIteration:
         pass