我是编码的新手,正在尝试编写一个简单的代码,该代码将包含一个列表,例如[1,2,3],并将元素循环n次。因此,如果n = 1,我应该得到A = [3,1,2]。如果n = 2,我应该得到A = [2,3,1]。我编写的代码是:
n=1
j=0
A = [1,2,3]
B = [None]*len(A)
while j<=n:
for i in range(0,len(A)):
B[i] = A[-1+i]
j=j+1
print(B)
问题是,无论n的值是多少,我都会得到相同的答案,该答案仅循环一次。我认为问题在于循环每次都循环通过相同的B,因此我需要将新的B存储为其他东西,然后用新的B重复循环。但是我不知道该怎么做。任何提示将不胜感激
答案 0 :(得分:6)
我认为您过于复杂了。考虑将其更改为以下内容:
n = 1
A = [1,2,3]
B = A.copy()
for _ in range(n):
# Cycle through by concatenating the last element and all other elements together
B = [B[-1]]+B[0:-1]
print(B)
如果是n=1
,您将得到[3, 1, 2]
,而n=2
会给您[2, 3, 1]
请注意,您尝试执行的操作是在numpy.roll
中实现的(我想您是在询问过程,而不是结果,只是为了以防万一)
import numpy as np
>>> np.roll(A,1)
array([3, 1, 2])
>>> np.roll(A,2)
array([2, 3, 1])
答案 1 :(得分:5)
一个更简单的功能是:
def roll(L, n):
n %= len(L)
return L[-n:] + L[:-n]
A = [1,2,3]
roll(A, 1) # [3, 1, 2]
roll(A, 2) # [2, 3, 1]
roll(A, 3) # [1, 2, 3]
roll(A, 4) # [3, 1, 2]
采用模数(n %= len(L)
)无需保持循环通过。然后,我们将适当大小的切片从列表的末尾连接到其开头。
答案 2 :(得分:2)
有关代码问题,请参见@sacul's answer。但是list
并不是最适合这种要求的结构,因为每个班次都具有O( n )复杂度。
collections
模块中的 deque
(“双端队列”)通过其rotate
方法提供了此功能。此方法在原位运行 并具有O( k )复杂度,其中 k 是表示转数的参数。这是一个示例:
from collections import deque
d = deque([1,2,3])
d.rotate(2)
print(d)
deque([2, 3, 1])
答案 3 :(得分:1)
@sacul的答案有效,但是您很接近!创建新的A
后,您错过了while循环的下一次迭代的B
更新。
n=1
j=0
A = [1,2,3]
B = [None]*len(A)
while j<=n:
for i in range(0,len(A)):
B[i] = A[-1+i]
A = B[:] # update A so that next time B works on the new A
print('A is now ', A) # to debug
j=j+1
print(B)
这将导致以下打印语句:
A is now [3, 1, 2]
A is now [2, 3, 1]
[2, 3, 1] # this is what finally B is
答案 4 :(得分:0)
基于itertools
的解决方案
from itertools import cycle, islice
def roll(x, n):
start = len(x) - n
return islice(cycle(x), start, start + len(x))
如果我们循环遍历x中的值(实际上最多只能执行两次)。然后对其进行切片,以使其从所需的元素开始,并包含正确数量的元素。
它可能比其他一些解决方案更深奥,但由于有很多选择,因此值得一提。
itertools.islice
返回一个生成器。如果要打印结果,则需要将其转换为list
。
答案 5 :(得分:-1)
因为有人已经回答了您的问题,所以不做深入介绍。但是这里要注意的一个重要属性是
A = [1, 2, 3] #Assuming that the length of the matrix you want to rotate is of length 3
If you want to cycle/rotate by 3, then you want to actually cycle/rotate by `len(A)%3` = 0
If you want to cycle/rotate by 6, then you want to actually cycle/rotate by `len(A)%6` = 0
If you want to cycle/rotate by 4, then you want to actually cycle/rotate by `len(A)%3` = 1
If you want to cycle/rotate by a number lesser than the length itself.. then just rotate it by that number!
so if you want to cycle by 2, then well.. rotate it by two..