【问题标题】:python generator drop certain number characterspython生成器删除某些数字字符
【发布时间】:2016-04-27 23:54:06
【问题描述】:
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

这有什么问题??? 谢谢!

【问题讨论】:

  • 你的意思是'camaro'[:-n]
  • n替换ii == len(list(iterable)) - n: 另外我认为你根本不需要counter
  • FWIW,您在下面的 print 声明中将 strip_last 引用为 drop_last
  • 我不太明白。你能帮我澄清一下吗?

标签: python iterator generator


【解决方案1】:

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

您可以使用itertools.tee 复制您的可迭代对象来构建您的计数器,或者您可以采用更简单的方法并在strip_last 中构建一个列表并迭代其中的slice[:-n]

编辑:添加代码 -

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

【讨论】:

  • 我认为你也可以在内部获得一个大小为 n 的块(一个简单的计数器获取 iterator.next() 1..n 次并将这些块作为更小的列表返回),这会阻止你从复制整个迭代器
  • 如果你列了一个列表,你就违背了tee 的目的,只需从一开始就列一个列表或者从像sum(1 for _ in size) 这样的可迭代对象中获取大小,还添加一个对负数计数器的检查
  • @Copperfield 同意了。该列表与整个目的相混淆,另一种方法是计算所有元素的大小,直到next() 引发异常,但无论哪种方式,我们都会得到他想要的:-P
【解决方案2】:

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

1) 你可以列出你的可迭代对象,然后遍历其中的一部分

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) )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多