0

问题是编写一个shift_right函数,以便将列表中的每个元素向右移动。例如,如果列表是

L = ['a','b','c','d']

shift_right(L)应该是['d','a','b','c']

这就是我尝试过的;我的输出是['d','a','a','a']

def shift_right(L):
    last_item = L[-1]

    for i in range(1, len(L)):
        L[i] = L[i-1]

    L[0] = last_item
4

3 回答 3

3

我会这样实现它:

def shift_right(L):
    if len(L) > 0:
        L.insert(0, L.pop())

正如李正确评论的那样,这是一个轮换操作,而不是一个转变。

于 2013-08-03T13:48:30.030 回答
2

为了完整起见,我将添加此内容。

如果你一次换几个,你可以使用类似的东西

def rotate(L, n):
    if len(L) is not 0:
        shift = n % len(L)
        L[:shift], L[shift:] = L[-shift:], L[:-shift]

如果您在整个程序中经常这样做,那么使用双端队列可能是值得的。您可以将列表转换为这样的双端队列:

from collections import deque
L = deque(L)

然后将其向右旋转 n 个空格,您可以使用

L.rotate(n)

如果要将其转换回列表,可以执行

L = list(L)

最好避免来回转换,因为它花费的时间与列表中的几次旋转一样多。当您围绕它们的开头和结尾访问、添加和删除时,双端队列的效果最好。

于 2013-08-04T02:05:59.923 回答
0

我刚刚想出了问题的答案。它如下。

def shift_right(L):
    last_item = L[-1]
    for i in range(1, len(L)):
        L[len(L) - i] = L[len(L) - i - 1]
    L[0] = last_item
于 2013-08-03T13:43:13.507 回答