Как в Python переместить элемент в определенный индекс в списке?
Как в Python переместить элемент в определенный индекс в списке?
Ответы:
Используйте 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] │ └──────────┴─────────────────────────────
Не большая разница, если вы используете его всего несколько раз, но если вы занимаетесь тяжелыми вещами, такими как ручная сортировка, важно выбрать самый быстрый. В противном случае я бы рекомендовал просто взять тот, который вы считаете наиболее читаемым.