Python 在不使用collection.deque的情况下旋转列表

Python 在不使用collection.deque的情况下旋转列表,python,list,python-2.7,Python,List,Python 2.7,我想写一个剧本。程序应该得到一些带有值的列表L,以及自然数N 如果N>0,列表的对象向左移动N步。 如果N这起作用: result = l[N % len(l):]+l[:N % len(l)] 您可以使用列表切片: def rotate(L, N): if not L or N % len(L) == 0: return L return L[N % len(L):] + L[:N % len(L)] L = [1, 2, 3, 4, 5] for N i

我想写一个剧本。程序应该得到一些带有值的列表
L
,以及自然数
N

如果
N>0
,列表的对象向左移动
N
步。
如果
N这起作用:

result = l[N % len(l):]+l[:N % len(l)]

您可以使用列表切片:

def rotate(L, N):
    if not L or N % len(L) == 0:
        return L
    return L[N % len(L):] + L[:N % len(L)]

L = [1, 2, 3, 4, 5]

for N in range(-3, 4):
    print(rotate(L, N))
输出:

[3, 4, 5, 1, 2]
[4, 5, 1, 2, 3]
[5, 1, 2, 3, 4]
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 1]
[3, 4, 5, 1, 2]
[4, 5, 1, 2, 3]

请注意,如果使用
列表
,则旋转的速度通常与列表中的元素数成线性关系,因为必须移动所有现有元素<另一方面,code>deque.rotate()
O(k)
,其中
k
是步数。因此,如果您需要多次旋转
deque.rotate()
是一种方法。

如果您不想创建新列表,可以尝试原地反向旋转

def reverse(nums, start, end):
    i = start
    j = end - 1
    while i < j:
        tmp = nums[i]
        nums[i] = nums[j]
        nums[j] = tmp
        i += 1
        j -= 1

def rotate(nums, n):
    if n == 0:
        return nums
    length = len(nums)
    if n < 0:
        n = length + n
    reverse(nums, 0, n)
    reverse(nums, n, length)
    reverse(nums, 0, length)
    return nums

>>> rotate([1, 2, 3, 4, 5], 1)
[2, 3, 4, 5, 1]
>>> rotate([1, 2, 3, 4, 5], -1)
[5, 1, 2, 3, 4]
def反转(nums、开始、结束): i=开始 j=结束-1 而i>>旋转([1,2,3,4,5],1) [2, 3, 4, 5, 1] >>>旋转([1,2,3,4,5],-1) [5, 1, 2, 3, 4]
如果您可以选择使用numpy,则有一种方法称为
roll
,您可能想看看:

import numpy as np

array = np.arange(1, 6)  # 1 to 5
print array
print np.roll(array, 0)
print np.roll(array, 2)
print np.roll(array, -2)
print np.roll(array, 17)
结果如预期:

[1 2 3 4 5]
[1 2 3 4 5]
[4 5 1 2 3]
[3 4 5 1 2]
[4 5 1 2 3]
谢谢大家!:) 你的回答很好,对我很有用

以下是我对这个问题的解决方案(假设我为生物学家的基本python课程编写了这些脚本):


如果您想要简单的列表,下面是如何在Python3中实现它(基于您的P2示例)


空名单不被考虑。是的,你是对的。可以通过使用result=l[N%len(l):]+l[:N%len(l)]来实现这一点,如果l为else[]
[1 2 3 4 5]
[1 2 3 4 5]
[4 5 1 2 3]
[3 4 5 1 2]
[4 5 1 2 3]
L = input('Enter list of numbers, please: ')
N = input('Enter how many places to rotate: ')
L1 = L[N:]
L2 = L[:N]
L = L1 + L2
print L
L = list(map(int, input("Enter numbers: ").split(" ")))
N = int(input("Enter how many rotations to perform: "))
print(L[N:] + L[:N])