仅在迭代时“循环”迭代一次

时间:2015-11-25 19:56:18

标签: python loops iterator cycle modulo

我想循环遍历列表(或任何其他可迭代的内容),我知道您可以使用cycle中的itertools函数执行此操作(如图所示{{3} }),但这个函数无限循环。我想知道是否有一种聪明的方法只做一次(并且不使用模运算符)。

我的意思是我希望以最后一项是第一项的方式迭代迭代。所以我想在迭代器到达可迭代的开头时开始迭代并停止。

像这样但不那么丑:

points = [1, 2, 3, 4, 5]
start = points[0]
iterator = cycle(points)

p = next(iterator)
while True:
    print(p)
    p = next(iterator)
    if p == start:
        print("quitting at", p)
        break

3 个答案:

答案 0 :(得分:1)

当然可以使用chainrepeat(适用于sequences)或tee(适用于iterators):

>>> from itertools import chain, repeat, tee
>>> print(*chain(*repeat([1, 2, 3], 2)))
1 2 3 1 2 3

>>> print(*chain(*tee(i for i in [1,2,3])))
1 2 3 1 2 3

Asterisk用于unpack argument lists

Answer by Ale(无重复链)如果已经将iterable分配给变量并且实际上需要两个周期,而不是八个或任何其他有限数,则更好。

更新

代码与更新的问题中的代码相同:

points = [1, 2, 3, 4, 5]
for x in points:
    print(x)
print("quitting at", points[0])

这基本上等同于the original answer by Tomás Glaría

答案 1 :(得分:1)

你能解释一下你的要求有多好吗? 您对cycleonly once的意思是什么?

这不仅仅是for item in list: do someting with item吗?

编辑:我对这个问题的理解是,你想要从任何索引开始迭代所有项目。 如果是,那么:

lista = range(10)
idx = 5
for item in lista[idx:]+lista[:idx]:
    print item

另一个编辑:¿我的问题是否正确? 如果你要求的是在第一个项目处停止,那么你只需迭代迭代器来获取剩余的项目(然后重建迭代器?)。

points = [1,3,5,7,9]
iterator = iter(points)

iterator.next()        #Let's remove a couple of items
iterator.next()        #Let's remove a couple of items

for item in iterator:
    print(item)

iterator = iter(points)

答案 2 :(得分:0)

为什么不链接或连接可迭代的?

a = [1,2,3]

for x in a + a:
    print x

from itertools import chain, tee
for x in chain(tee(a, 2)):
    print x

这看起来很简单