【问题标题】:Iterating skipper function迭代船长函数
【发布时间】:2014-03-01 16:33:03
【问题描述】:

当前使用 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

有人有什么想法吗?

【问题讨论】:

    标签: python string int iterable


    【解决方案1】:

    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
    

    【讨论】:

    • 我不允许使用 itertools 内置模块,这是一个练习,所以我想知道如何解决它。哈哈。
    • @user2559679:请参阅为islice 提供的等效 Python 代码。
    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多