Python 迭代;周期性地;超过一次就够了
我想循环遍历一个列表(或任何其他iterable),我知道您可以使用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)
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)