2013-04-08 63 views
1

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

以下代码仅返回[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

由于'counter'有一个比'数组元素少'和'new'指向与'counter'相同的列表,并且您返回'new',则返回的元素将比原始列表少一个元素。 – 2013-04-08 03:41:33

回答

11

range(5)返回[0, 1, 2, 3, 4]。它不包括5

只需从range(len(array)-1)删除-1它应该工作。

您还可以使用列表分片:

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

您需要删除您范围-1

counter = range(len(array)) 

如果你想有一个更快的方法虽然 你可以改为尝试使用双端队列?

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])) 
+0

这有助于很多esp建议使用deque以及如何将双端转换回列表。 – 2016-12-04 11:05:53

5

这里是Python方式:

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

的答案是好的,但如果关键是比数组的长度时,这是行不通的。如果您认为最关键的将是比数组长度,使用以下命令:

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

正键左移和负键右移。

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] 

唯一潜在的惩罚是,如果数组足够大,你可能会遇到内存问题,因为这个操作是做一个副本。使用绝对值大于数组长度的“键”会导致包装和结果可能不如预期,但不会出错。

0

如果你乐于使用numpy的,那么你可以使用滚动功能:

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()