python生成器删除某些数字字符

时间:2016-04-27 23:54:07

标签: python iterator generator

def hide(iterable):
    for v in iterable:
        yield v

def strip_last(iterable,n):
    counter = 0
    for i in iterable:
        counter += 1
        if n == len(list(iterable)) - counter + 1:
            return 
        yield i

print(''.join([v for v in strip_last(hide('camaro'), 1)]))

我正在尝试定义一个可以产生每个值的strip_last函数 从可迭代的,除了最后的n个值,如下所示:

camar

但它只给了我:

c

它有什么问题? 谢谢!

2 个答案:

答案 0 :(得分:1)

当您创建len(list(iterable))时,您清空了iterable,因此您没有其他元素可以迭代。

您可以使用itertools.tee复制您的iterable来构建您的计数器,或者您可以采用更简单的方法并在strip_last内构建一个列表并迭代slice[:-n]。{/ p>

修改:添加代码 -

def strip_last(iterable,n):
    size, word = itertools.tee(iterable)
    counter = len(list(size)) - n
    while counter:
        counter -= 1
        yield word.next()

答案 1 :(得分:0)

对于通用迭代,您有2个选项:

1)你可以列出你的iterable,然后迭代它的一部分

2)你可以一直保留可迭代的n + 1个元素并产生一个并且要求其他元素,当你不能拥有n + 1个元素时,你知道你已经完成了

from itertools import islice #, izip
from collections import deque

def strip_last_v1(iterable,n):
    it = tuple(iterable)  #because tuple weight less than a list of the same size
    stop = len(it) - n
    if stop > 0:
        for x in islice(it,stop): #I use islice instead of it[:-n] because the later make a copy of the tuple
            yield x

def strip_last_v2(iterable,n):
    n = n+1
    stack = deque(maxlen=n)
    it = iter(iterable)
    for e,_ in zip(it,range(n)): #izip and xrange for python 2
        stack.append(e)
    while len(stack) == n:
        yield stack.popleft()
        stack.append( next(it) )