Итак, у меня есть список, и я хочу переместить число элементов в начале списка до последнего элемента в списке, где последний элемент представляет число элементов, которые мне нужно переместить. Например: [2, 19, 6, 26, 1, 15, 12, 3]
, а так как последний элемент - 3, результат будет выглядеть как [26, 1, 15, 12, 2, 19, 6, 3]
. Кто-нибудь знает, как я могу индексировать список таким образом?Перемещение первых элементов до последнего элемента в списке python
ответ
Чтобы получить последний элемент списка, вы бы взять
-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]
Я думаю, что вы также можете выполнить 'lst [: lst [-1]]' вместо 'lst [0: lst [-1]]'. Обычно я вижу первую форму с неявным '0'. (Это действительно заманчиво прямо сейчас сказать «экономит 1 байт» ...;) – refi64
@ kirbyfan64sos Ха-ха, спасибо! (в гольф с байта ...) – Doorknob
Просто обратите внимание, что в случае последнего числа (тот, который указывает, сколько будет сдвигаться) будет '> =', чем количество элементов в списке, оно добавит его снова. EG: 'move_items ([2,19,6,26,1,15,12,8])' -> '[2, 19, 6, 26, 1, 15, 12, 8, 8]'. – FirstOne
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]
Я заставляю это просто использовать понятные имена переменных .. – DSM
попробовать это:
l = [2, 19, 6, 26, 1, 15, 12, 3]
l2 = l[l[-1]:-1] + l[:l[-1]] + [l[-1]]
print l2
версия с использованием по модулю, который создает единый список без нарезки:
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 будет означать циклирование списка, в котором разрезание будет увеличиваться, и вы добавите повторяющиеся элементы, вам может понадобиться обработать этот случай.
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
, поэтому мне просто нужно получить 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
@ vig143, вы имеете в виду мутировать исходный список? Все мои примеры дают вам ожидаемый результат, если вы хотите изменить исходный список, используйте 'my_list [:] = swap (my_list)' –
- 1. Перемещение элементов в списке (Python)
- 2. Перемещение элементов в списке Python
- 3. Получение второго до последнего элемента в списке
- 4. Взятие первых двух элементов в списке
- 5. Сокращение до 15 элементов после определенного элемента в списке python
- 6. Удаление последнего элемента в списке
- 7. Как предотвратить перемещение последнего элемента?
- 8. Укладка первых 10 элементов в списке
- 9. Перемещение вверх и перемещение элементов в списке
- 10. От второго до последнего элемента в списке в F #
- 11. Списки в Python последнего элемента
- 12. Программа для поиска последнего элемента в списке?
- 13. Рекурсивно найти nth до последнего элемента в связанном списке
- 14. Перемещение элементов в общем списке Lisp
- 15. падение первых п элементов в списке
- 16. Только получение последнего элемента в списке
- 17. обратного индекс последнего ненулевого элемента в списке
- 18. проверка подобия последнего элемента в списке списка python
- 19. Java-перемещение последнего элемента массива в начало
- 20. Перемещение списка в позицию последнего элемента
- 21. получение последнего и первого нескольких элементов в списке в python
- 22. Случайное перемещение определенного количества элементов в списке Python
- 23. Доступ последнего элемента в списке в питоне
- 24. Перемещение элементов в связанном списке C# .NET
- 25. Возвратные индексы первых элементов во вложенном списке
- 26. Разрешить прокрутку до последнего элемента
- 27. Удаление поля из последнего элемента в списке
- 28. Scala поиск последнего элемента в списке карт
- 29. Повторение последнего элемента в связанном списке
- 30. Удаление последнего элемента в списке? vb 2008
Это вызов? Это для продуктивной работы? Имейте в виду, что списки в Python (в отличие от списков на других языках) на самом деле не оптимизированы для операций сдвига/ролла. Если у вас есть ограниченное использование этого в небольших списках, почему бы и нет? Но если вы хотите внедрить такую вещь в какой-то более тяжелый процесс, вы должны знать о сложности этих операций (см. Https://wiki.python.org/moin/TimeComplexity) и, возможно, сосредоточиться на индексированной системе , Индексируя начало вашего списка, а не создавая новые списки, вы можете сохранить сложность O (1), а не O (n). –