我正在尝试移动数组的元素,以便所有元素都替换为前一个元素,如下所示: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])
答案 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])