Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 迭代;周期性地;超过一次就够了_Python_Loops_Iterator_Cycle_Modulo - Fatal编程技术网

Python 迭代;周期性地;超过一次就够了

Python 迭代;周期性地;超过一次就够了,python,loops,iterator,cycle,modulo,Python,Loops,Iterator,Cycle,Modulo,我想循环遍历一个列表(或任何其他iterable),我知道您可以使用itertools(如图所示)中的cycle函数来实现这一点,但该函数无限循环。我想知道是否有一种聪明的方法只做一次(并且不使用模运算符) 我的意思是,我想迭代一个iterable,这样最后一项就是第一项。所以我想开始迭代,并在迭代器到达iterable开头时停止 像这样但不那么难看的东西: points = [1, 2, 3, 4, 5] start = points[0] iterator = cycle(points)

我想循环遍历一个列表(或任何其他iterable),我知道您可以使用
itertools
(如图所示)中的
cycle
函数来实现这一点,但该函数无限循环。我想知道是否有一种聪明的方法只做一次(并且不使用模运算符)

我的意思是,我想迭代一个iterable,这样最后一项就是第一项。所以我想开始迭代,并在迭代器到达iterable开头时停止

像这样但不那么难看的东西:

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

为什么不链接或连接iterable

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
这似乎很简单

当然,但有and(for)或(for):

星号用来表示

如果iterable已经分配给变量,并且实际上需要两个循环,而不是说八个或任何其他有限数,那么(无重复链)就更好了

更新 与更新问题中的代码等效:

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

这基本上相当于。

你能更好地解释一下你的要求吗。 你说的
循环
仅一次
是什么意思

这不只是列表中项目的
:对项目做一些事情吗

编辑:我对这个问题的理解是,您希望迭代从任何索引开始的所有项。 若有,则:

lista = range(10)
idx = 5
for item in lista[idx:]+lista[:idx]:
    print item
另一个编辑:?我答对问题了吗? 如果您要求的是在第一个项处停止,那么您只需要在迭代器上迭代其余项(然后可能重建迭代器?)


你说的一次是指一份吗?你能举个例子吗?如果
foo
实现了您需要的功能,那么foo([1,2,3])中x的
输出将是什么:打印(x)
?请参阅更新的问题。请参阅我更新的答案,并解释您尝试实现的功能与基本for循环的不同之处。如果没有不同,那么这个问题可能是的重复。如果您定义
点=[1,2,1,4,5]
,那么您的代码只输出前两个元素和“在1退出”。这是你想要的行为吗?(我的会输出
1 2 1 4 5
和“1时退出”,所以这里有一个区别)这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-我无法对帖子发表评论,但现在我可以了。他说他只需要骑一次自行车;-)这是如何等价的?打破循环的标准是在循环遍历iterable之后遇到第一个节点。@aaragon它在输出(副作用)相同的意义上是等价的。你不能抱怨实现目标的方法不同,因为更好的方法是你所要求的。相反,您应该改进您的问题,以表明for循环不是一个充分的解决方案(如果是这样的话)。胡说八道。我的问题很清楚地说明了这个问题。此外,如果我能写那段代码,很明显我能想出一个和你一样微不足道的答案。@aaragon你最后的评论是非建设性的。更不用说它被认为是忘恩负义和粗鲁的。如果您来这里寻求帮助,让我们帮助您并完善您的问题,从而解释为什么这个“琐碎”的代码对您来说不够好。虽然它对您来说“非常清楚”,但对其他至少5个人来说显然不那么清楚。这只有在iterable支持多次迭代的情况下才会起作用。否则,当
chain
第二次遍历它时,iterable将被消耗。修复方法是使用
itertools.tee
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)