Перемістити елемент всередині списку?


Відповіді:


160

Використовуйте insertметод списку:

l = list(...)
l.insert(index, item)

Крім того, ви можете використовувати позначення зрізів:

l[index:index] = [item]

Якщо ви хочете перемістити елемент, який уже є у списку, на вказане місце, вам доведеться видалити його та вставити на нове місце:

l.insert(newindex, l.pop(oldindex))

22
Пам’ятайте лише про те, що переміщення елемента, який уже є у списку методом вставки / попси, матиме різну поведінку залежно від того, чи рухаєтесь ви вперед або назад. Перемістивши ліворуч ви вставляєте перед обраним вами об'єктом. Перемістившись назад, ви вставляєте після обраного вами предмета. Перевірте перехід до кінця списку (помилка індексу).
МКарас

Як перемістити кілька елементів? Дано список a = [1,2,3,4,5,6,7,8,9], як перетворити його на [1,2, [3,4,5], 6,7,8,9 ]? Чи можна це зробити за один крок або за допомогою розуміння списку?
g33kz0r

@MKaras Я перевірив це за допомогою Python 3.5, і ви МОЖЕТЕ вставити його last index + 1без помилок. У цьому випадку елемент просто додається до списку.
користувач2061057

@ user2061057 вірно :) навіть великі індекси призведуть до речей, вставлених наприкінці. a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman

1
Для тих, хто намагається використовувати індекс -1, щоб вставити елемент наприкінці, натомість потрібно використовувати len (l).
нд

31

Трохи коротше рішення, яке лише переміщує елемент до кінця, ніде це не таке:

l += [l.pop(0)]

Наприклад:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

13
Ви також можете використовувати l.append(l.pop(0)). Це лише незначно довше, але набагато читабельніше.
coredumperror

Як я можу замість цього перемістити його до початку?

19

Якщо ви не знаєте позицію елемента, можливо, спочатку потрібно знайти індекс:

old_index = list1.index(item)

потім перемістіть його:

list1.insert(new_index, list1.pop(old_index))

або ІМХО чистішим способом:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
Я думаю, я маю рацію passзаперечувати вашу заяву ... ніколи не приховуйте винятків - за замовчуванням у такому прикладі має бути надання більш чистої заяви про помилку чи друку заяви ... raise ValueError(f'Unable to move item to {new_index}')або print(f'Moving item to {new_index} failed. List remains unchanged.'). Можливо, passбуло б нормально, якби у функції викликали try_to_move_itemщось таке, щоб її зрозуміли, що операція може вийти з ладу.
flutefreak7

3

Рішення дуже просте, але ви повинні знати індекс початкової позиції та індекс нової позиції:

list1[index1],list1[index2]=list1[index2],list1[index1]

6
Це своп, а не хід.
джузлін

0

Я профілював кілька методів переміщення елемента в одному списку з timeit. Ось ті, які слід використовувати, якщо j> i:

┌──────────────────────────────────┐
│ 14.4usec │ x [i: i] = x.pop (j), │
│ 14.5usec │ x [i: i] = [x.pop (j)] │
│ 15.2usec │ x.insert (i, x.pop (j)) │
└──────────────────────────────────┘

і ось ті, які слід використовувати, якщо j <= i:

┌─────────────────────────────────────────
│ 14.4usec │ x [i: i] = x [j],; del x [j] │
│ 14.4usec │ x [i: i] = [x [j]]; del x [j] │
│ 15.4usec │ x.insert (i, x [j]); del x [j] │
└─────────────────────────────────────────

Не величезна різниця, якщо ви використовуєте її лише кілька разів, але якщо ви робите важкі речі, такі як ручне сортування, важливо взяти найшвидший. В іншому випадку я рекомендую взяти той, який, на вашу думку, є найбільш читаним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.