Python跳过迭代器

时间:2015-10-27 20:07:47

标签: python iterator

我正在尝试使用迭代器在Python中构建一个'skipper'。

这个想法是给出以下内容的:

' '.join([str(i) for i in skippy([1,'a','b','b',2,1,1,1,'c','d','b'])

我们得到了

1 b b 2 1 d b

作为输出。规则是每当我们达到整数x时,我们跳过迭代中的跟随 x项。

到目前为止,我有:

def skippy(it):
    p = 0    
    for x in it:
        if type(x) == int:
           for x in range(x):
              p = next(it)
           yield p

这不能按预期工作,有关如何修复它的任何想法吗?

3 个答案:

答案 0 :(得分:5)

使用单独的px时,无法确定您要实现的目标。你可以这样做:

def skippy(it):
    it = iter(it)
    for x in it:
        if type(x) is int:
            yield x
            for skip in range(x):
                next(it)
        else:
            yield x

>>> ' '.join([str(i) for i in skippy(iter([1,'a','b','b',2,1,1,1,'c','d','b']))])
'1 b b 2 1 d b'

如果您希望能够直接传递列表,则需要在参数上调用iter,因为列表是可迭代的,而不是迭代器,并且您只能调用next迭代器。

答案 1 :(得分:1)

你可以跳过(没有双关语)收益率并做基本操作:

def skippy(it):
  skip = 0
  answer = []
  for x in it:
    if skip>0:
      skip -= 1;
    elif type(x) == int:
      skip = x
      answer.append(str(x))
    else:
      answer.append(str(x))
  return ' '.join(answer)

答案 2 :(得分:1)

您可以创建自己的跳过者迭代类,并定义下一个功能来执行您想要的操作

class Skippy:
    def __init__(self, l):
        self.l = l
        self.current = 0
        self.high = len(l)

    def __iter__(self):
        return self

    def next(self):
        if self.current >= self.high:
            raise StopIteration
        else:
            current = self.l[self.current]
            self.current += 1
            if type(current) == int:
                self.current += self.l[self.current-1]
            return current

l = ' '.join([str(i) for i in Skippy([1,'a','b','b',2,1,1,1,'c','d','b'])])
print l

1 b b 2 1 d b