Python 使用Dropwhile从嵌套循环快进xrange?
我看过相关的帖子,但不完全是这个问题。我正在寻找一种在外部循环中快速前进迭代器而不在循环中调用next()的方法 答案可能只是在内部循环中使用相同的迭代器,但我认为使用itertools可能有一个不错的方法,我使用的是dropwhile(),但它没有达到我预期的效果 所以我在一个循环中有一个循环:Python 使用Dropwhile从嵌套循环快进xrange?,python,itertools,Python,Itertools,我看过相关的帖子,但不完全是这个问题。我正在寻找一种在外部循环中快速前进迭代器而不在循环中调用next()的方法 答案可能只是在内部循环中使用相同的迭代器,但我认为使用itertools可能有一个不错的方法,我使用的是dropwhile(),但它没有达到我预期的效果 所以我在一个循环中有一个循环: cl = ['a', 'b', 'c', 'd', 'e'] rangeiter = xrange(0, len(cl)) for x in rangeiter: print('{}-'.fo
cl = ['a', 'b', 'c', 'd', 'e']
rangeiter = xrange(0, len(cl))
for x in rangeiter:
print('{}-'.format(x)),
for y in xrange(x, len(cl)):
print('{}'.format(cl[y])),
if y == 3:
print
break
# fast forward parent range
rangeiter = dropwhile(lambda v: v < y, rangeiter)
当我想
0- a b c d
4- e
谢谢 for循环为iterables创建迭代器
xrange()
是一个序列(iterable),而不是迭代器
显式创建迭代器,然后通过使用dropwhile()
(在该对象上迭代!)跳过元素来推进该迭代器:
cl = ['a', 'b', 'c', 'd', 'e']
rangeiter = iter(xrange(0, len(cl)))
for x in rangeiter:
print('{}-'.format(x)),
for y in xrange(x, len(cl)):
print('{}'.format(cl[y])),
if y == 3:
print
break
# fast forward parent range
next(dropwhile(lambda v: v < y, rangeiter), None)
cl=['a','b','c','d','e']
rangeiter=iter(xrange(0,len(cl)))
对于rangeiter中的x:
打印({}-'.format(x)),
对于x范围内的y(x,len(cl)):
打印(“{}.”格式(cl[y]),
如果y==3:
打印
打破
#快进父范围
下一个(dropwhile(lambda v:v
请注意,
dropwhile
我将您的dropwhile
条件调整为基于y
,而不是x
;您的预期输出表明您希望将外部范围提升到内部循环达到的位置之外。xrange
不是迭代器;它是一个序列(因此仅仅是一个iterable)。for
循环使用iter(iterable)
为它生成一个迭代器。我假设xrange自己模拟了迭代器(实际上我想要一个生成器)。有没有办法使内部计数器前进?当条件在这里时,lambda v:vx
是外部迭代器的当前值,因此dropwhile()
将加载下一个值,这就是下一个值。对于x=0
,这意味着下一个值,1
更大,迭代停止;外部循环将继续执行x=2
。你的意思是用v
来代替吗?是的,谢谢,我刚刚注意到它也应该是viter(现有的_迭代器)
返回迭代器本身。如果您想跳过所有迭代器,还可以抛出StopIteration异常。@LeedianielCrocker:如果您希望捕获该异常,则不会。for
语句只查找它正在循环的迭代器引发的StopIteration
,而不查找循环体中引发的相同异常。
cl = ['a', 'b', 'c', 'd', 'e']
rangeiter = iter(xrange(0, len(cl)))
for x in rangeiter:
print('{}-'.format(x)),
for y in xrange(x, len(cl)):
print('{}'.format(cl[y])),
if y == 3:
print
break
# fast forward parent range
next(dropwhile(lambda v: v < y, rangeiter), None)