Python列表旋转

Python列表旋转,python,list,rotation,Python,List,Rotation,可能重复: 我希望将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): r

可能重复:

我希望将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
的参数是一个列表和一个表示移位的整数。函数使用创建两个新列表,并返回这些列表的连接。
旋转
功能不会修改输入列表

更传统的方向:

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])

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

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

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(li, x):
  return li[-x % len(li):] + li[:-x % len(li)]

以下功能将列表
l
x
空格向右旋转:

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)]
一般向左旋转
n
(调用
rotate
)或向右旋转
n
),然后:

如果希望旋转方向与示例相同,只需在“旋转”中取反
y

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

   return l[y:] + l[:y]
一般向左旋转
n
(调用
rotate
)或向右旋转
n
),然后:

如果希望旋转方向与示例相同,只需在“旋转”中取反
y

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

   return l[y:] + l[:y]


我不使用Python,但是如果有push/pop方法,可以使用l.push(l.pop())。然后循环它。这将包括前进。有帮助吗?@DrewNoakes:这两个都显示在SO搜索结果的第一页“python列表旋转”。我认为需要使用较短的单词形式另一个问题是关于效率的;这一条可能涵盖了稍有不同的领域。这一“重复”,这里的答案比原来的更有用。谢谢我不使用Python,但是如果有push/pop方法,可以使用l.push(l.pop())。然后循环它。这将包括前进。有帮助吗?@DrewNoakes:这两个都显示在SO搜索结果的第一页“python列表旋转”。我认为需要使用较短的单词形式另一个问题是关于效率的;这一条可能涵盖了稍有不同的领域。这一“重复”,这里的答案比原来的更有用。谢谢又好又简单。它的旋转方向与问题中指定的方向相反。@S.Lott:在他的例子中,可以说OP的方向是向后的。大多数关于列表旋转的切片习惯用法的Python教程的符号约定与Mr E first rotation函数的方向相同……我要添加
n=n%len(n)
,以使
n>len(n)
能够工作。我不确定您的意思。该函数不修改输入参数,而是返回一个新列表。可能最好就您的问题问一个新问题。@user1071136我想您的意思是
n=n%len(l)
。很好,很简单。它的旋转方向与问题中指定的方向相反。@S.Lott:在他的例子中,可以说OP的方向是向后的。大多数关于列表旋转的切片习惯用法的Python教程的符号约定与Mr E first rotation函数的方向相同……我要添加
n=n%len(n)
,以使
n>len(n)
能够工作。我不确定您的意思。该函数不修改输入参数,而是返回一个新列表。可能最好问一个关于您的问题的新问题。@user1071136我想您的意思是
n=n%len(l)
。有没有办法不用
返回
?我试过
l=l[n::+l[:n]
但是当我试着返回
l
时,我得到了原件。@GinKin为什么没有返回?这就是从函数返回内容的方式。我的意思是,你可以使用lambda,但这只会使返回隐式。我想让它“就位”,这样它就不会返回任何东西,如果我在运行函数后键入
>>>l
,我会得到一个旋转列表,而不是原始列表。@GinKin而不是
return…
你可以说
l[:]=…
,它会在原地执行。不过,我不建议这样做。@Python中的GinKin函数通常被认为没有副作用;通常,如果某个参数是某个方法的第一个(
self
)参数,则只更改其中一个参数。不过,这只是一个惯例。有没有办法不返回
而实现这一点?我试过
l=l[n::+l[:n]
但是当我试着返回
l
时,我得到了原件。@GinKin为什么没有返回?这就是从函数返回内容的方式。我的意思是,你可以使用lambda,但这只会使返回隐式。我想让它“就位”,这样它就不会返回任何东西,如果我在运行函数后键入
>>>l
,我会得到一个旋转列表,而不是原始列表。@GinKin而不是
return…
你可以说
l[:]=…
,它会在原地执行。不过,我不建议这样做。@Python中的GinKin函数通常被认为没有副作用;通常,如果某个参数是某个方法的第一个(
self
)参数,则只更改其中一个参数。这只是个惯例,图格