使用Dropwhile从嵌套循环中快速转发xrange?

时间:2014-11-24 16:03:46

标签: python itertools

我见过相关帖子,但不是这个问题。我正在寻找一种方法来快速转发外部循环中的迭代器,而无需在循环中调用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
1- b c d
2- c d
3- d
4- e

我想要的时候

0- a b c d
4- e

The code is here

谢谢!

1 个答案:

答案 0 :(得分:2)

for循环为迭代创建迭代器; xrange()序列(可迭代),而不是迭代器。

显式创建迭代器,然后使用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)

请注意dropwhile我根据dropwhile调整了您的y条件,而不是x;您的预期输出表明您希望将外部范围推进到内循环所达到的范围之外。