我试图在python3中向左旋转数组。我正在使用的代码是:
def rotLeft(a, d):
b = a
lengthOfArray = len(a)
shift = d
for i in range (0,lengthOfArray):
print(a)
newLocation = (i + (lengthOfArray - shift)) % lengthOfArray
b[newLocation] = a[i]
return b
if __name__ == '__main__':
nd = input().split()
n = int(nd[0])
d = int(nd[1])
a = list(map(int, input().rstrip().split()))
result = rotLeft(a, d)
print(result)
它需要用户输入三个信息,分别是元素数组的长度,要执行的转数和数组本身。但是,不是旋转元素,而是在相同位置填充第一个元素的数组。例如:
输入:
5 4
12 76 1 09 13
输出:
[12, 12, 12, 12, 12]
我的算法有什么问题,怎么解决?
答案 0 :(得分:3)
rotate方法的第一行出现错误:
像[13, 12, 76, 1, 9]
这样的简单分配不会创建列表的真实副本,就像人们期望的那样。而是两个变量都指向内存中的相同列表。因此,如果您在b = a
中进行了更改,则更改也会反映在a
中,反之亦然。
要创建该阵列的新副本,请使用:
b
有关复制数组的更多可能性,请查看以下内容:How to clone or copy a list?
答案 1 :(得分:1)
您的算法非常好,唯一的问题是b=a
使b也指向a,但是您想要的是取copy
的a,这是通过对列表进行切片{{1} },然后代码运行正常。
b = a[:]
输出将为
def rotLeft(a, d):
#Take copy of a and assign to b
b = a[:]
lengthOfArray = len(a)
shift = d
for i in range (0,lengthOfArray):
newLocation = (i + (lengthOfArray - shift)) % lengthOfArray
b[newLocation] = a[i]
return b
print(rotLeft([12, 76, 1, 9, 13], 4))
答案 2 :(得分:1)
import copy
然后尝试
b = copy.copy(a)
代替
b = a
有关这两个为何不同的详细信息,请参见https://docs.python.org/2/library/copy.html。
另外,也许考虑只使用列表理解:
def rotLeft(a, d):
lengthOfArray = len(a)
shift = d
return [a[i + shift - lengthOfArray] for i in range(lengthOfArray)]
答案 3 :(得分:0)
您正在制作一些复杂的东西。简单点。 您想向左旋转“ n”个位置,例如,数组长度(l)= 5,rotate(n)= 3。从头开始获取前三个元素,然后在数组的后面添加。
如果n>数组长度(l),则首先获取“ n-[n mod l]”个元素,然后在数组的黑色处添加。