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的自变量是一个列表和一个表示移位的整数。该函数使用切片创建两个新列表,并返回这些列表的连接。rotate函数不修改输入列表。

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

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(li, 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]

最新更新