可能的复制品: 在 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]
More conventional direction:
def rotate(l, n): return l[n:] + l[:n]
Example:
example_list = [1, 2, 3, 4, 5] rotate(example_list, 2) # [3, 4, 5, 1, 2]
The arguments to rotate are a list and an integer denoting the shift. The function creates two new lists using slicing and returns the concatenatenation of these lists. The rotate function does not modify the input list.
rotate
If applicable, you could use collections.deque as a solution:
collections.deque
import collections d = collections.deque([1,2,3,4,5]) d.rotate(3) print d >>> deque([3, 4, 5, 1, 2])
As a bonus, I'd expect it to be faster than in-built list.
The following function will rotate the list l, x spaces to the right:
l
x
def rotate(l, x): return l[-x:] + l[:-x]
Note that this will only return the original list if x is outside the range [-len(l), len(l)]. To make it work for all values of x, use:
[-len(l), len(l)]
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]
A general rotate n to the left (positive y in the call to rotate) or right (negative y) then:
n
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]
If you want the direction of rotation to be the same as your example, just negate y in rotate.
y
def rotate(l, y=1): if len(l) == 0: return l y = -y % len(l) # flip rotation direction return l[y:] + l[:y]