2015-11-05 29 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]