Як я можу перемістити елемент у визначений індекс у списку?
Як я можу перемістити елемент у визначений індекс у списку?
Відповіді:
Використовуйте insertметод списку:
l = list(...)
l.insert(index, item)
Крім того, ви можете використовувати позначення зрізів:
l[index:index] = [item]
Якщо ви хочете перемістити елемент, який уже є у списку, на вказане місце, вам доведеться видалити його та вставити на нове місце:
l.insert(newindex, l.pop(oldindex))
last index + 1без помилок. У цьому випадку елемент просто додається до списку.
a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
Трохи коротше рішення, яке лише переміщує елемент до кінця, ніде це не таке:
l += [l.pop(0)]
Наприклад:
>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]
l.append(l.pop(0)). Це лише незначно довше, але набагато читабельніше.
Якщо ви не знаєте позицію елемента, можливо, спочатку потрібно знайти індекс:
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
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щось таке, щоб її зрозуміли, що операція може вийти з ладу.
Рішення дуже просте, але ви повинні знати індекс початкової позиції та індекс нової позиції:
list1[index1],list1[index2]=list1[index2],list1[index1]
Я профілював кілька методів переміщення елемента в одному списку з 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] │ └─────────────────────────────────────────
Не величезна різниця, якщо ви використовуєте її лише кілька разів, але якщо ви робите важкі речі, такі як ручне сортування, важливо взяти найшвидший. В іншому випадку я рекомендую взяти той, який, на вашу думку, є найбільш читаним.