Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Dropwhile从嵌套循环快进xrange?_Python_Itertools - Fatal编程技术网

Python 使用Dropwhile从嵌套循环快进xrange?

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

我看过相关的帖子,但不完全是这个问题。我正在寻找一种在外部循环中快速前进迭代器而不在循环中调用next()的方法

答案可能只是在内部循环中使用相同的迭代器,但我认为使用itertools可能有一个不错的方法,我使用的是dropwhile(),但它没有达到我预期的效果

所以我在一个循环中有一个循环:

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:v下降是什么
x
是外部迭代器的当前值,因此
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)