我想在列表中从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
等等
您可以使用列表切片创建具有偏移的列表,然后使用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]
这里有另一种使用指针的方法:
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]
尝试以下操作:
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,并且循环不会执行。每个循环的呢? 问题答案: 我的问题是每个循环的空列表如何工作 也以相同的方式工作。如果长度为零,则永远不会执行循环。 它们
我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky
问题内容: 此代码将导致无限循环的机会是什么? 实际上,这会导致无限循环。我的怀疑是因为我没有服用,是真的吗? 问题答案: 是。除非您不打电话,否则它将永远不会继续进行下一项。Beause 将返回您已在列表/集中添加的对象。