2013-04-08 153 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()