在python中移动数组的元素

时间:2013-04-08 03:37:21

标签: python arrays

我正在尝试移动数组的元素,以便所有元素都替换为前一个元素,如下所示:shift(1,[5,6,7])=> [7,5,6]。

以下代码仅返回[7,5]。有人可以告诉我是什么导致这种情况发生?我一步一步地完成了代码,根本无法找到解决方案。我还尝试了3种不同的口译员。

def shift(key, array):
    counter = range(len(array)-1)
    new = counter
    for i in counter:
        new[i] = array[i-key]
    return new

print shift(1, [5, 6, 7])

8 个答案:

答案 0 :(得分:11)

range(5)返回[0, 1, 2, 3, 4]。它排除了5

只需从-1移除range(len(array)-1)即可。

您还可以使用列表切片:

def shift(key, array):
    return array[-key:] + array[:-key]

答案 1 :(得分:5)

这是python方式:

def shift(key, array):
    return array[-key:]+array[:-key]

答案 2 :(得分:4)

您需要从您的范围中移除-1

counter = range(len(array))

如果你想要更快的方法, 你可以尝试使用deque吗?

from collections import deque

def shift(key, array):
    a = deque(array) # turn list into deque
    a.rotate(key)    # rotate deque by key
    return list(a)   # turn deque back into a list


print (shift(1, [5, 6, 7]))

答案 3 :(得分:0)

答案很好,但如果密钥大于数组的长度则不起作用。如果您认为密钥大于数组长度,请使用以下命令:

def shift(key, array):
    return array[key % len(array):] + array[:key % len(array)]

正键将向左移动,负键将向右移动。

答案 4 :(得分:0)

#!/usr/bin/env python

def ashift(key,array):
        newqueue = array[-key:]
        newqueue.extend( array[:-key] )
        return newqueue


print ashift( 1, [5,6,7] )
print ashift( 2, [5,6,7] )

结果:

$ ./shift 
[7, 5, 6]
[6, 7, 5]

唯一可能的惩罚是,如果阵列足够大,您可能会遇到内存问题,因为此操作正在执行复制。使用绝对值大于数组长度的“密钥”将导致换行,结果可能不符合预期,但不会出错。

答案 5 :(得分:0)

numpy 程序包包含 roll 函数,可以完成此任务:

import numpy as np
b=[5,6,7]
c=np.roll(b,1).tolist()

>>> c
[7, 5, 6]

功能是:

def shift(key, array):
    return np.roll(array,key).tolist()

答案 6 :(得分:0)

老式的流行POP和APPEND

arr = [5, 6, 7]

for _ in range(0, 2):
    shift = arr.pop(0)
    arr.append(shift)

print(arr)

=>[7, 5, 6]

答案 7 :(得分:0)

您可以使用numpy roll

>>> x = np.arange(10)
>>> np.roll(x, 2)
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
>>> np.roll(x, -2)
array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])