2016-02-02 46 views
-1

我试图编写一个程序,该程序从用户处获取列表和数字'N'的步骤。该程序将循环移动该列表。如果数字是正数,则列表中的项目将向左移动N个步骤,如果N为负数,则项目向右移动N个步骤。如果N = 0,则列表不会改变。以圆形方式移动数组

L=[1,2,3,4,5] 
if N==0 > [1,2,3,4,5] 
if N==1 > [2,3,4,5,1] 
if N==-1 > [5,1,2,3,4] 

有人可以给我一个线索如何编写这个程序?

+0

所以基本上旋转阵列?你只需要一些适当的流行/移位型操作。 –

+1

你应该在python中查看切片。 http://stackoverflow.com/questions/509211/explain-pythons-slice-notation –

+0

它对N = 1和N = -1做同样的事情吗? –

回答

2

这可以做到我们ing片:

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

使用deque和否定n如果要反转的逻辑:

from collections import deque 

deq = deque([1, 2, 3, 4, 5]) 
n = 0 
deq.rotate(-n) 
print(deq) 

deq = deque([1, 2, 3, 4, 5]) 
n = 1 
deq.rotate(-n) 
print(deq) 

deq = deque([1, 2, 3, 4, 5]) 
n = -1 
deq.rotate(-n) 
print(deq) 

输出:

deque([1, 2, 3, 4, 5]) 
deque([2, 3, 4, 5, 1]) 
deque([5, 1, 2, 3, 4]) 

n可以比元素的数量较大和旋转仍然有效:

In [5]: deq = deque([1, 2, 3, 4, 5]) 

In [6]: deq.rotate(12) 

In [7]: deq 
Out[7]: deque([4, 5, 1, 2, 3]) 
+0

因为旋转一个deque会改变deque本身的顺序,所以我会特别推荐编写一个自己的函数来传递一个列表,并将这个列表转换成一个deque。然后旋转deque并将其返回。所以原始数据订单保持不变。如果需要,您可以在返回之前将该双端转换为列表。 – albert

+0

@albert,如果在原始列表中传递一个列表是不会改变的,除非OP需要一些列表特定的行为,那么他们应该使用deques。 –

+0

这比切片复杂得多。请参阅pp_的答案和我的。 – zondo