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
它有什么问题? 谢谢!
答案 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) )