En Python, ¿cómo muevo un elemento a un índice definido en una lista?
En Python, ¿cómo muevo un elemento a un índice definido en una lista?
Respuestas:
Utilice el insert
método de una lista:
l = list(...)
l.insert(index, item)
Alternativamente, puede usar una notación de sector:
l[index:index] = [item]
Si desea mover un elemento que ya está en la lista a la posición especificada, tendrá que eliminarlo e insertarlo en la nueva posición:
l.insert(newindex, l.pop(oldindex))
last index + 1
sin errores. En ese caso, el elemento simplemente se agrega a la lista.
a.insert(99999, 1)
In [14]: a
Out[14]: [...., 1]
Una solución un poco más corta, que solo mueve el artículo hasta el final, no a ninguna parte es esta:
l += [l.pop(0)]
Por ejemplo:
>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]
l.append(l.pop(0))
. Es solo un poco más largo, pero es mucho más legible.
Si no conoce la posición del elemento, es posible que primero deba buscar el índice:
old_index = list1.index(item)
luego muévelo:
list1.insert(new_index, list1.pop(old_index))
o en mi humilde opinión de una manera más limpia:
try:
list1.remove(item)
list1.insert(new_index, item)
except ValueError:
pass
pass
declaración ... nunca oculte las excepciones: lo predeterminado en un ejemplo como este debería ser proporcionar una declaración de error más limpia o una declaración de impresión ... raise ValueError(f'Unable to move item to {new_index}')
o print(f'Moving item to {new_index} failed. List remains unchanged.')
. Tal vez pass
estaría bien si se llamara a una función try_to_move_item
o algo para que se entendiera que la operación podría fallar silenciosamente.
Una solución muy sencilla, pero hay que conocer el índice de la posición original y el índice de la nueva posición:
list1[index1],list1[index2]=list1[index2],list1[index1]
He perfilado algunos métodos para mover un elemento dentro de la misma lista con timeit. Estos son los que se deben usar si j> i:
┌──────────┬──────────────────────┐ │ 14.4usec │ x [i: i] = x.pop (j), │ │ 14.5usec │ x [i: i] = [x.pop (j)] │ │ 15.2usec │ x.insertar (i, x.pop (j)) │ └──────────┴──────────────────────┘
y aquí los que se deben usar si 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.insertar (i, x [j]); del x [j] │ └──────────┴───────────────────────────┘
No es una gran diferencia si solo lo usa unas pocas veces, pero si hace cosas pesadas como la clasificación manual, es importante tomar la más rápida. De lo contrario, recomendaría simplemente tomar el que crea que es más legible.