HOWTO · Python

Intercambiar elementos de una lista en Python

Este tutorial demuestra cómo intercambiar los elementos de una lista en Python.

En esta página

Intercambiar elementos de una lista de Python cambia qué valores ocupan sus posiciones. El desempaquetado de tuplas de Python permite intercambiar un par de forma concisa. Una variable temporal hace explícita cada asignación, mientras que pop() junto con insert() mueve valores dentro de la lista. La asignación de segmentos resulta útil cuando se quiere invertir un tramo en lugar de intercambiar solo dos posiciones.

Intercambiar elementos de una lista con desempaquetado de tuplas

El desempaquetado de tuplas evalúa los valores de la derecha antes de asignarlos a los destinos indexados de la izquierda. Así, cada destino recibe el valor original de la otra posición sin necesidad de una variable auxiliar. Python indexa las listas desde cero, por lo que el primer elemento está en el índice 0.

Para dos posiciones conocidas, usa esta forma directa. Ejecuta este ejemplo. La salida muestra los nombres de los colores intercambiados, que permanecen en inglés dentro del ejemplo:

items = ["red", "blue", "green", "gold"]
items[1], items[3] = items[3], items[1]
print(items)
['red', 'gold', 'green', 'blue']

Esto intercambia en el sitio los valores segundo y cuarto. La lista conserva su longitud y los elementos que están fuera de esos índices permanecen en sus posiciones originales.

Para intercambiar varios pares independientes, coloca los pares de índices en un iterable y aplica la misma asignación a cada par:

items = [6, 2, 7, 8, 5, 9, 10, 3]
for left, right in [(0, 3), (4, 6)]:
    items[left], items[right] = items[right], items[left]
print(items)
[8, 2, 7, 6, 10, 9, 5, 3]

Cada iteración intercambia un par usando los valores actuales de la lista. Elige pares cuyos índices correspondan a las posiciones que quieres modificar; si los pares se solapan, un intercambio anterior puede afectar a lo que encuentra uno posterior.

Intercambiar elementos con una variable temporal

Una variable temporal muestra las tres asignaciones necesarias para realizar un intercambio. Primero guarda un valor; después, sobrescribe su posición en la lista con el otro valor y, por último, coloca el valor guardado en la segunda posición. Esta opción resulta útil cuando detallar los pasos facilita seguir la lógica que los rodea.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

items = [6, 2, 7, 8]
temp = items[1]
items[1] = items[3]
items[3] = temp
print(items)

La variable temporal debe guardar el valor original antes de que se sobrescriba su posición en la lista. Para un par sencillo, el desempaquetado de tuplas es más breve; ambos métodos actualizan la lista existente.

Usar pop() y insert() para intercambiar elementos

pop() es un método de lista que elimina un elemento y devuelve su valor. Al eliminarlo, los elementos posteriores se desplazan una posición a la izquierda, así que los índices pueden apuntar a otros valores. insert() es otro método de lista: coloca un valor antes de la posición indicada y desplaza los elementos posteriores a la derecha.

Para intercambiar los valores que originalmente estaban en los índices 1 y 3, elimina primero el índice menor. El valor que estaba originalmente en el índice 3 pasa entonces al índice 2:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

items = [6, 2, 7, 8]
first = items.pop(1)
second = items.pop(2)
items.insert(1, second)
items.insert(3, first)
print(items)

El segundo pop() usa el índice 2 porque la primera eliminación desplazó los elementos restantes. Después de ambas eliminaciones, insertar los valores guardados en las posiciones 1 y 3 devuelve la lista a su longitud original y deja intercambiado el par. Este método requiere más pasos que la asignación directa y resulta útil sobre todo cuando eliminar y volver a insertar ya forman parte de la operación.

Invertir un segmento para cambiar el orden de un tramo

Un segmento selecciona un tramo mediante start:stop:step. El índice inicial se incluye y el índice final se excluye; un paso negativo recorre los valores seleccionados en orden inverso. La asignación de segmentos reemplaza la parte seleccionada de una lista por otra secuencia.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

items = [6, 2, 7, 8]
items[1:4] = items[1:4][::-1]
print(items)

En este caso, el tramo seleccionado contiene los índices 1, 2 y 3, así que la asignación invierte los tres valores. No se limita a intercambiar los extremos. Para intercambiar exactamente dos valores adyacentes invirtiendo un tramo, selecciona un segmento de dos elementos; para dos índices cualesquiera, el desempaquetado de tuplas es más claro.

Elegir un método y comprobar los índices

Usa el desempaquetado de tuplas para intercambiar directamente un par y un bucle sobre pares de índices para realizar varios intercambios independientes. Recurre a una variable temporal cuando la secuencia explícita ayude a explicar el código que la rodea. pop() y insert() cambian las posiciones de la lista al quitar y agregar valores, así que vuelve a calcular los índices después de cada eliminación. Usa la asignación de segmentos cuando el resultado deseado sea invertir el tramo seleccionado.

Los índices de una lista empiezan en 0. Una lectura o asignación con un índice fuera de las posiciones válidas de la lista provoca IndexError. Antes de intercambiar valores, comprueba que cada índice esté dentro de la lista y que las dos posiciones correspondan a los valores que quieres cambiar. Estas comprobaciones son especialmente útiles si los índices provienen de datos introducidos por el usuario o se calculan a partir de otros datos.