Python跳跃i

2024-05-19 21:38:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

其想法是考虑到以下因素:

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

我们得到了

^{pr2}$

作为输出。规则是每次我们碰到一个整数x时,我们跳过iterable中的下面的x项。在

到目前为止,我已经:

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

但这并不像预期的那样有效,有什么解决办法吗?在


Tags: inforif规则deftypeit整数
3条回答

您可以跳过(没有双关语)收益并执行基本操作:

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)

您可以创建自己的skipper迭代类并定义下一个函数来执行您想要的操作

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

不确定使用单独的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,因为列表是一个iterable,而不是迭代器,而且只能在迭代器上调用next。在

相关问题 更多 >