2013-08-03 3 views
0

Вопрос заключается в том, чтобы написать функцию shift_right, чтобы она сдвигала каждый элемент в списке вправо. Например, если списокshift_right python, использующий для циклов

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 
+2

Это фактически поворот вправо, а не сдвиг. Дэвид, ниже, имеет правильный код для этого на месте. –

ответ

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 
3

Я бы реализовать это следующим образом:

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

Как правильно Ли комментарии, это поворот операции, а затем сдвиг.

+2

В качестве альтернативы, поскольку вставка и поп должны эффективно изменять размер и перераспределять список, а во избежание проверки len, чтобы избежать значенияerrorerror по умолчанию, тогда меня соблазнит 'L [:] = L [-1:] + L [: -1] 'и возвращать None, чтобы придерживаться принципа Python, что мутации не возвращают мутированный объект. –

+0

@JonClements: но это решение создает два временных списка, объединяет их для создания третьего временного списка и * затем * назначает временную ... что кажется менее эффективным, чем просто изменить размер и перераспределить (особенно потому, что Python, вероятно, не сократит фактическое хранилище списков). – nneonneo

+0

Большое спасибо Давиду и Джону –

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) 

затем повернуть его п пространства справа, вы можете использовать

L.rotate(n) 

Если вы хотите, чтобы преобразовать его обратно в список, вы можете сделать

L = list(L) 

лучше избегать перехода вперед и назад, так как он занимает столько же времени, как несколько поворотов в списке. Deques работают лучше всего, когда вы просматриваете, добавляете и удаляете их начало и конец.