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两个新列表,并返回这些列表的连接。 rotate
function不会修改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])
作为奖励,我希望它比内置列表更快。
下面的函数将把列表l
, x
空格向右旋转:
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]
一般向左旋转n
( rotate
调用中的正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]