2015-11-05 78 views
1

我明白這個問題以前已經被問過了,但我還沒有看到任何回答它的方式沒有拆分列表。在列表中旋轉值[Python]

說我有一個列表:

num = [1,2,3,4,5,6] 

我想創建一個函數:

rotate(lst, x): 

所以,如果我把它rotate(num, 3)將在全球範圍編輯列表num。這種方式,當我後來致電print(num)它將導致[4,5,6,1,2,3]

我明白,我可以寫的功能類似:

rotate(lst, x): 
    return [lst[-x:] + lst[:-x] 

但我需要做的沒有return語句此功能,並且不要把名單。我在想的是將列表的最後一個值放入一個變量中:q = lst[-1]然後從那裏創建一個循環,該循環運行x繼續將值移動到列表末尾並代替第0個位置與任何存儲在q中的位置。

還有一件事。如果我打電話rotate(lst, -3),那麼不必旋轉到「右」,它將不得不旋轉到「左」。

我是python的新手,並且在處理列表的這個概念時遇到了麻煩。感謝大家的時間和精力。我希望這個問題很清楚。

+3

,而不是「全球編輯列表」,人們通常說的「就地編輯列表*。*」 – turbulencetoo

+0

您可能會發現這個有趣的:http://stackoverflow.com/questions/23321216/rotating -an-array-using-juggling-algorithm – Prayag

+0

謝謝!總是有助於更新行話。 :) – Tom

回答

0

嘗試:

num = [1,2,3,4,5,6] 

def rotate(lst,x): 
    copy = list(lst) 
    for i in range(len(lst)): 
     if x<0: 
      lst[i+x] = copy[i] 
     else: 
      lst[i] = copy[i-x] 

rotate(num, 2) 

print num 
1

這是一個使用雙端隊列的解決方案。 根據需要,它會對列表進行修改,既不使用return也不使用該列表的塊。

from collections import deque 

def rotate(lst, x): 
    d = deque(lst) 
    d.rotate(x) 
    lst[:] = d 

num = [1,2,3,4,5,6] 
rotate(num,3) 
print(num) 
rotate(num,-3) 
print(num) 

產生

[4, 5, 6, 1, 2, 3] 
[1, 2, 3, 4, 5, 6] 

請對deque

+0

這不會修改'num',就像他要求的那樣...... – rofls

+0

@rofls我剛纔看了一下這個例子,謝謝你指出了。編輯。 – Pynchia

3

看看PMOTW的tutorial您可以使用切片分配修改當前的策略,做你想做的。你已經正確地產生旋轉列表,只需修改列表到位與lst[:] = ...

def rotate(lst, x): 
    lst[:] = lst[-x:] + lst[:-x] 

例如,在交互式解釋:

>>> l = [1, 2, 3, 4, 5, 6] 
>>> def rotate(lst, x): 
...  lst[:] = lst[-x:] + lst[:-x] 
... 
>>> rotate(l, 2) 
>>> l 
[5, 6, 1, 2, 3, 4] 

現在向後旋轉它:

>>> rotate(l, -2) 
>>> l 
[1, 2, 3, 4, 5, 6] 
>>> rotate(l, -2) 
>>> l 
[3, 4, 5, 6, 1, 2] 

在另一個問題上看到這個答案:https://stackoverflow.com/a/10623383/3022310

+0

沒問題,但沒有'沒有退貨聲明,也沒有拆分清單。'要求? – Pynchia

+0

Hrm ...我可以看到'沒有拆分列表'可能意味着'不允許使用切片運算符',但這不是我第一次閱讀它的方式。 – turbulencetoo

+0

是的,所以這個解決方案沒有返回語句工作正常,但它分裂了列表。有沒有辦法做到這一點沒有分裂?對不起,分裂,切片...我是新手:/ – Tom

0

這是一個使用pop和插入列表的簡單方法。

num = [1,2,3,4,5,6] 

def rotate(lst, x): 
    if x >= 0: 
     for i in range(x): 
      lastNum = lst.pop(-1) 
      lst.insert(0, lastNum) 

    else: 
     for i in range(abs(x)): 
      firstNum = lst.pop(0) 
      lst.append(firstNum) 

    return 

print num #[1, 2, 3, 4, 5, 6] 
rotate(num, 2) 
print num #[5, 6, 1, 2, 3, 4] 
rotate(num, -2) 
print num #[1, 2, 3, 4, 5, 6] 
0

我相信這符合所有要求。這個想法來自Programming Pearls的書(http://goo.gl/48yJPw)。要旋轉列表,我們可以反轉它,然後將旋轉索引作爲關鍵點來反轉子列表。

def rotate(num, rot): 
    if rot < 0: 
     rot = len(num) + rot 
    rot = rot - 1 
    num.reverse() 
    for i in range(rot/2 + 1): 
     num[i], num[rot-i] = num[rot-i], num[i] 
    for i in range(1, (len(num) - rot)/2): 
     num[rot+ i], num[len(num) - i] = num[len(num) - i], num[rot+ i] 

#Testing... 
num = range(1, 10) 
rot = -1 
print num 
rotate(num, rot) 
print num 
0
def rotate(lst, num): 
    copy = list(lst) 
    for (i, val) in enumerate(lst): 
     lst[i] = copy[i - num]