Python 左旋转阵列

Python 左旋转阵列,python,arrays,algorithm,data-structures,Python,Arrays,Algorithm,Data Structures,我试图在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[

我试图在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]

我的算法出了什么问题,我该如何修复它?

你的算法非常好,唯一的问题是
b=a
使b也指向a,但你想要的是复制a的
副本,通过列表切片
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))
输出将是

[13, 12, 76, 1, 9]

旋转方法的第一行出现错误:

b=A
这样的简单赋值不能像人们期望的那样创建列表的真实副本。相反,这两个变量只是指向内存中的同一个列表。因此,如果您在
a
中更改了某些内容,这些更改也将反映在
b
中,反之亦然

要创建该阵列的新副本,请使用:

b = a[:]

有关复制阵列的更多可能性,请查看以下内容:

您正在制作一些复杂的东西。简单点。 您希望向左旋转“n”个位置,例如数组长度(l)=5,旋转(n)=3。从开始处获取前3个元素,并添加到数组的后面

如果n>数组长度(l),则首先取“n-[n mod l]”元素并在数组的黑色处添加。

使用复制模块有效地复制列表,而无需在内存中共享相同的地址。 然后试试看

b = copy.copy(a)
而不是

b = a
有关这两者不同的原因的详细信息,请参阅

也可以考虑使用列表理解:

def rotLeft(a, d):
    lengthOfArray = len(a)
    shift = d
    return [a[i + shift - lengthOfArray] for i in range(lengthOfArray)]

可能重复的
b=a
不会复制列表<代码>a
b
是对同一列表的引用。因此,
b[newLocation]=a[i]
的结果与,
a[newLocation]=a[i]
参见,
def rotLeft(a, d):
    lengthOfArray = len(a)
    shift = d
    return [a[i + shift - lengthOfArray] for i in range(lengthOfArray)]