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
)参数,则只更改其中一个参数。这只是个惯例,图格