【问题标题】:iterate "cyclically" over an iterable only once仅在可迭代对象上“循环”迭代一次
【发布时间】:2015-11-25 19:56:17
【问题描述】:

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

我的意思是,我想迭代一个可迭代对象,以使最后一项是第一项。所以我想在迭代器到达可迭代的开头时开始迭代并停止。

类似的东西,但不那么丑:

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

【问题讨论】:

  • 一次,你的意思是一份?
  • 你能举个例子吗?如果foo 实现了你所需要的,for x in foo([1,2,3]): print(x) 的输出会是什么?
  • 查看更新的问题。
  • 查看我更新的答案,并请解释您要实现的目标与基本的 for 循环有何不同。如果没有不同,那么这个问题可能与Which is the most efficient way to iterate through a list in python? 重复。
  • 如果你定义points = [1, 2, 1, 4, 5],那么你的代码只输出前两个元素和“在1 时退出”。这是你想要的行为吗? (我的会输出 1 2 1 4 5 和“在 1 点退出”,所以这里有区别)

标签: python loops iterator cycle modulo


【解决方案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)

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 我无法对帖子发表评论,但现在可以了。
【解决方案2】:

当然可以,但是使用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

星号用于unpack argument lists

Answer by Ale(没有重复的链)如果已经将可迭代对象分配给变量并且实际上需要两个循环,而不是说八个或任何其他有限数,则效果会更好。

更新

代码相当于更新问题中的代码:

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

【讨论】:

  • 他说他只需要骑一次;-)
  • 那是怎样的?打破循环的标准是循环遍历可迭代对象后遇到第一个节点。
  • @aaragon 在输出(副作用)相同的意义上是等效的。您不能抱怨实现目标的方法不同,因为更好的方法是您所要求的。相反,您应该完善您的问题,以表明 for 循环不是一个足够的解决方案(如果是这样的话)。
  • 废话。我的问题非常清楚地说明了这个问题。此外,如果我能够编写该代码,很明显我可以想出一个和你一样微不足道的答案。
  • @aaragon 您最后的评论是非建设性的。更不用说它是忘恩负义和粗鲁的。如果您来这里寻求帮助,请让我们帮助您并完善您的问题,以便解释为什么这个“微不足道”的代码对您来说不够好。虽然对您来说“非常清楚”,但对于至少 5 个其他人来说显然不是那么清楚。
【解决方案3】:

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

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

这看起来很简单

【讨论】:

  • 这只有在可迭代对象支持多次迭代时才有效。否则,当chain 第二次对其进行迭代时,将消耗可迭代对象。 修复是使用itertools.tee.
猜你喜欢
  • 2012-09-15
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2015-07-20
相关资源
最近更新 更多