Python列表旋转

可能重复:
有效的方法来移动Python中的列表

我想通过任意数量的项目向右或向左旋转Python列表(后者使用负参数)。

像这样的东西:

>>> l = [1,2,3,4] >>> l.rotate(0) [1,2,3,4] >>> l.rotate(1) [4,1,2,3] >>> l.rotate(-1) [2,3,4,1] >>> l.rotate(4) [1,2,3,4] 

这可怎么办?

 def rotate(l, n): return l[-n:] + l[:-n] 

更传统的方向:

 def rotate(l, n): return l[n:] + l[:n] 

例:

 example_list = [1, 2, 3, 4, 5] rotate(example_list, 2) # [3, 4, 5, 1, 2] 

rotate的参数是一个列表和一个整数,表示移位。 该函数使用切片创build两个新列表,并返回这些列表的连接。 rotatefunction不会修改input列表。

如果适用,您可以使用collections.deque作为解决scheme:

 import collections d = collections.deque([1,2,3,4,5]) d.rotate(3) print d >>> deque([3, 4, 5, 1, 2]) 

作为奖励,我希望它比内置列表更快。

下面的函数将把列表lx空格向右旋转:

 def rotate(l, x): return l[-x:] + l[:-x] 

请注意,如果x在范围[-len(l), len(l)]之外,这将仅返回原始列表。 要使它适用于x所有值,请使用:

 def rotate(l, x): return li[-x % len(li):] + li[:-x % len(li)] 
 >>> l=[1,2,3,4] >>> l[1:]+l[:1] [2, 3, 4, 1] >>> l=[1,2,3,4] >>> l[2:]+l[:2] [3, 4, 1, 2] >>> l[-1:]+l[:-1] [4, 1, 2, 3] 

一般向左旋转nrotate调用中的正y)或向右(负y),则:

 def rotate(l, y=1): if len(l) == 0: return l y = y % len(l) # Why? this works for negative y return l[y:] + l[:y] 

如果你想旋转的方向与你的例子相同,只是否定旋转y

 def rotate(l, y=1): if len(l) == 0: return l y = -y % len(l) # flip rotation direction return l[y:] + l[:y]