我正在尝试使用迭代器在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
这不能按预期工作,有关如何修复它的任何想法吗?
答案 0 :(得分:5)
使用单独的p
和x
时,无法确定您要实现的目标。你可以这样做:
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