2015-11-14 3 views
1

Итак, у меня есть список, и я хочу переместить число элементов в начале списка до последнего элемента в списке, где последний элемент представляет число элементов, которые мне нужно переместить. Например: [2, 19, 6, 26, 1, 15, 12, 3], а так как последний элемент - 3, результат будет выглядеть как [26, 1, 15, 12, 2, 19, 6, 3]. Кто-нибудь знает, как я могу индексировать список таким образом?Перемещение первых элементов до последнего элемента в списке python

+0

Это вызов? Это для продуктивной работы? Имейте в виду, что списки в Python (в отличие от списков на других языках) на самом деле не оптимизированы для операций сдвига/ролла. Если у вас есть ограниченное использование этого в небольших списках, почему бы и нет? Но если вы хотите внедрить такую ​​вещь в какой-то более тяжелый процесс, вы должны знать о сложности этих операций (см. Https://wiki.python.org/moin/TimeComplexity) и, возможно, сосредоточиться на индексированной системе , Индексируя начало вашего списка, а не создавая новые списки, вы можете сохранить сложность O (1), а не O (n). –

ответ

3
  • Чтобы получить последний элемент списка, вы бы взять -1 го индекса (l[-1]).

  • Для того чтобы получить первые n элементы списка, кусочек от 0 до n (l[0:n]); Python позволит вам опустить начальный 0.

  • Чтобы получить элементы из n на второй последний элемент в списке, ломтик от n до -1 (l[n:-1]).

Сведя все это вместе, вы бы использовать что-то вроде:

def move_items(lst): 
    return lst[lst[-1]:-1] + lst[:lst[-1]] + [lst[-1]] 

в действии:

>>> def move_items(lst): 
...  return lst[lst[-1]:-1] + lst[:lst[-1]] + [lst[-1]] 
... 
>>> move_items([2,19,6,26,1,15,12,3]) 
[26, 1, 15, 12, 2, 19, 6, 3] 
+0

Я думаю, что вы также можете выполнить 'lst [: lst [-1]]' вместо 'lst [0: lst [-1]]'. Обычно я вижу первую форму с неявным '0'. (Это действительно заманчиво прямо сейчас сказать «экономит 1 байт» ...;) – refi64

+1

@ kirbyfan64sos Ха-ха, спасибо! (в гольф с байта ...) – Doorknob

+1

Просто обратите внимание, что в случае последнего числа (тот, который указывает, сколько будет сдвигаться) будет '> =', чем количество элементов в списке, оно добавит его снова. EG: 'move_items ([2,19,6,26,1,15,12,8])' -> '[2, 19, 6, 26, 1, 15, 12, 8, 8]'. – FirstOne

1
def split(x): 
    y = x[:] # make a copy: not to harm incoming list 
    numToMove = y.pop() 
    return (numToMove, y[:numToMove], y[numToMove:]) 

a = [2, 19, 6, 26, 1, 15, 12, 3] 
(num, head, tail) = split(a) 
answer = tail + head + [num] 
+0

Я заставляю это просто использовать понятные имена переменных .. – DSM

0

попробовать это:

l = [2, 19, 6, 26, 1, 15, 12, 3] 
l2 = l[l[-1]:-1] + l[:l[-1]] + [l[-1]] 
print l2 
0

версия с использованием по модулю, который создает единый список без нарезки:

def swap(l): 
    i, ln = l[-1], len(l) - 1 
    for j in range(ln): 
     yield l[(i + j) % ln] 
    yield i 

Выход:

In [2]: l = [2, 19, 6, 26, 1, 15, 12, 3] 

In [3]: list(swap(l)) 
Out[3]: [26, 1, 15, 12, 2, 19, 6, 3] 

Или с помощью collections.deque:

from collections import deque 
def swap(l): 
    ln, deq = len(l) - 1, deque(l) 
    i = deq.pop() 
    deq.rotate(ln - i), deq.append(i) 
    return deq 

Более сжатая версия, но использует больше памяти:

def swap(l): 
    i, ln = l[-1], len(l) - 1 
    return [l[(i + j)% ln] for j in range(ln)] + [i] 

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

+0

Ive попробовал предложения, которые вы дали, но безрезультатно. Мне нужно изменить список. До сих пор у меня есть insert_top_to_bottom ([1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 3, 6, 9, 12, 15, 18, 21, 24, 27, 2, 5, 8 , 11, 14, 17, 20, 23, 26]) [23, 26, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 3, 6, 9, 12, 15, 18, 21, 24, 27, 2, 5, 8, 11, 14, 17, 20] – vig143

+0

, поэтому мне просто нужно получить 1,4,7,10,13,16,19,22,25,28, 3,6,9,12,15,18,21,24,27,2,5,8,11,14,17,20 перед 26 – vig143

+0

@ vig143, вы имеете в виду мутировать исходный список? Все мои примеры дают вам ожидаемый результат, если вы хотите изменить исходный список, используйте 'my_list [:] = swap (my_list)' –

Смежные вопросы