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]

プログラム全体でこれを頻繁に行う場合は、deque を使用する価値があります。次のように、リストを両端キューに変換できます。

from collections import deque
L = deque(L)

次に、右にnスペース回転するには、次を使用できます

L.rotate(n)

それをリストに戻したい場合は、次のことができます

L = list(L)

リスト内の数回のローテーションと同じくらい時間がかかるため、前後の変換は避けたほうがよいでしょう。Deque は、先頭と末尾にアクセス、追加、および削除する場合に最適に機能します。

于 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 に答える