当前位置: 首页 > 知识库问答 >
问题:

如何无限迭代列表,每个循环有1个偏移量

邓昊天
2023-03-14

我想在列表中从0到结尾无限迭代,但在下一个循环中,我想从1开始到结尾加0,下一个循环将从2开始到结尾加0,1,直到最后一个项目,它将再次从0开始到结尾。

这是我的代码:

a = [ 0, 1, 2 ]
offset = 0
rotate = 0

while True:
    print(a[rotate])
    offset += 1
    rotate += 1
    if offset >= len(a):
        offset = 0
        rotate += 1
    if rotate >= len(a):
        rotate = 0

这就是我目前提出的解决方案。这远非完美。

我想要的结果是:

0, 1, 2 # first iteration
1, 2, 0 # second iteration
2, 0, 1 # third iteration
0, 1, 2 # fourth iteration

等等

共有3个答案

姜凯风
2023-03-14

您可以使用列表切片创建具有偏移的列表,然后使用itertools无限重复它们。cycle()。这将精确计算所有旋转一次,然后循环所有旋转:

from itertools import cycle, islice

lst = [0, 1, 2]
concat_lst = lst + lst
items = [concat_lst[i:i+len(lst)] for i in range(len(lst))]
iterator = cycle(items)

for item in islice(iterator, 10):
    print(item)

一旦您通过了预计算,上述方法就很快了,但您可能(取决于您的用例)更喜欢不需要预先花费时间/空间的方法。在这种情况下,可以使用生成器:

from itertools import cycle, islice

def rotate(lst):
    concat_lst = lst + lst
    for start in cycle(range(len(lst))):
        yield concat_lst[start:start+len(lst)]

lst = [0, 1, 2]
for item in islice(rotate(lst), 10):
    print(item)

这两种输出:

[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
[0, 1, 2]
姚臻
2023-03-14

这里有另一种使用指针的方法:

a = [ 0, 1, 2 ]
i = 0
l = len(a)
while True:
  out = []
  for j in range(i, i+l):
    out.append(a[j%l])
  print(out)
  i=(i+1)%l

输出:

[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
徐高懿
2023-03-14

尝试以下操作:

a = [0, 1, 2]

while True:
    print(a)
    a.append(a[0])
    a.pop(0)

输出:

[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
[0, 1, 2]
[1, 2, 0]
[2, 0, 1]
...

编辑(Tomerikoo建议):要删除括号,请使用

a = [0, 1, 2]

while True:
    print(*a, sep=', ')
    a.append(a[0])
    a.pop(0)

输出:

0, 1, 2
1, 2, 0
2, 0, 1
0, 1, 2
1, 2, 0
2, 0, 1
...

编辑2(ShadowRanger建议):pop返回删除的元素,因此可以简化

a = [0, 1, 2]

while True:
    print(*a, sep=', ')
    a.append(a.pop(0))

输出:

0, 1, 2
1, 2, 0
2, 0, 1
0, 1, 2
1, 2, 0
2, 0, 1
...
 类似资料:
  • 我被分配了一个任务,创建一个列表列表,在列表中,我应该能够使用“for each”类型的“for”循环遍历列表,而不是为迭代器构建一个构造函数。问题是,当我阅读下面的代码时,我得到错误消息“只能迭代一个数组或java.lang.Iterable的一个实例”。以下是代码: 非常感谢。

  • 考虑这个简单的C++函数来计算数组的前缀和: 它是4个融合的UOP1,这个CPU可以支持4个融合的OPs/周期。 有通过和携带的依赖链,每个都是一个循环,但是这些UOP可以到4个ALU端口中的任何一个,所以似乎不太可能冲突。融合的需要转到p6,这是一个更令人担忧的问题,但我只测量到p6的1.1 UOPS/迭代。这将解释每次迭代1.1个循环,但不是1.4个循环。如果我将循环展开2倍,端口压力会低得多

  • 问题 你在代码中使用 while 循环来迭代处理数据,因为它需要调用某个函数或者和一般迭代模式不同的测试条件。 能不能用迭代器来重写这个循环呢? 解决方案 一个常见的IO操作程序可能会想下面这样: CHUNKSIZE = 8192 def reader(s): while True: data = s.recv(CHUNKSIZE) if data ==

  • 问题内容: 我在http://www.leepoint.net/notes- java/flow/loops/foreach.html上 阅读。每个等价于 是 我的问题是每个循环的空列表如何工作。我知道对于常规的for循环,arr.length只会计算为0,并且循环不会执行。每个循环的呢? 问题答案: 我的问题是每个循环的空列表如何工作 也以相同的方式工作。如果长度为零,则永远不会执行循环。 它们

  • 问题内容: 此代码将导致无限循环的机会是什么? 实际上,这会导致无限循环。我的怀疑是因为我没有服用,是真的吗? 问题答案: 是。除非您不打电话,否则它将永远不会继续进行下一项。Beause 将返回您已在列表/集中添加的对象。

  • 我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky