Los slices en Python son una herramienta muy útil, que nos permite extraer porciones de secuencias de elementos (como listas, tuplas o cadenas) con muy poco código.
Los slices nos permiten trabajar con fragmentos específicos de una secuencia, sin tener que modificar ni iterar sobre la secuencia.
La sintaxis básica para crear un slice en Python es la siguiente:
secuencia[inicio:fin:paso]
inicio
: Índice donde comienza el slice (incluido)fin
: Índice donde termina el slice (no incluido)paso
: Tamaño del paso o incremento entre elementos del slice (opcional)
Consideraciones especiales
Omisión de valores valores
Podemos omitir uno, varios, o incluso todos los parámetros del Slice. Este se comportará distinto cada omisión.
Si no especificamos:
- El
inicio
, el slice comenzará desde el primer elemento - El
fin
, el slice terminará en el último elemento - El
paso
, el slice usará un paso de1
primeros_salvo_tres = numeros[3:] # Extrae los elementos del 3 al final
primeros_tres = numeros[:3] # Extrae los tres primeros elementos
Ver más abajo los ejemplos para entender bien los conceptos 👇
Uso de índices negativos
Python permite usar índices negativos para referirse a elementos relativos final de la secuencia (en lugar que desde el principio).
Parece un poco complicado, y al principio lía un poco. Pero básicamente,
ultimos_tres = numeros[-3:] # Extrae los últimos tres elementos
primeros_salvo_tres = numeros[:-3] # Extrae los elementos, salvo los tres últimos
Por otro lado, si el paso
, es negativo, el Slice recorre la secuencia en orden inverso.
Nuevamente, ver más abajo los ejemplos para entender bien los conceptos 👇
Modificación de valores con slices
Los Slices también pueden ser utilizados para modificar valores en una secuencia.
frutas = ["manzana", "banana", "cereza", "dátil", "uva"]
frutas[1:3] = ["pera", "naranja"] # Reemplaza "banana" y "cereza" por "pera" y "naranja"
En este caso,
frutas[1:3]
selecciona los elementos"banana"
y"cereza"
- Los reemplaza con
"pera"
y"naranja"
.
Ejemplos prácticos
Supongamos que tenemos una lista de números:
numeros = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Ahora, veamos cómo el Slicing se comporta con diferentes combinaciones de inicio, fin y paso:
Sin especificar inicio, fin ni paso
resultado = numeros[:]
print(resultado) # Resultado: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
En este caso, el slice copia toda la lista original, ya que no se especifica ningún valor para inicio
, fin
o paso
.
Especificando inicio y fin
resultado = numeros[2:7]
print(resultado) # Resultado: [2, 3, 4, 5, 6]
Aquí, el slice comienza en el índice 2 y termina en el índice 6 (no inclusivo), utilizando el paso predeterminado de 1
.
Especificando solo fin
resultado = numeros[:5]
print(resultado) # Resultado: [0, 1, 2, 3, 4]
En este caso, el Slice comienza desde el primer elemento y termina en el índice 5 (no inclusivo), utilizando el paso predeterminado de 1
.
Especificando solo inicio
resultado = numeros[3:]
print(resultado) # Resultado: [3, 4, 5, 6, 7, 8, 9]
Aquí, el Slice comienza en el índice 3 y continúa hasta el último elemento de la lista, utilizando el paso predeterminado de 1
.
Especificando solo paso
numeros = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numeros_pares = numeros[::2] # Resultado: [0, 2, 4, 6, 8]
Aquí, numeros[::2]
crea un nuevo slice de la lista numeros
con un paso de 2
, lo que significa que extrae cada segundo elemento, resultando en [0, 2, 4, 6, 8]
.
Especificando todo
resultado = numeros[1:8:2]
print(resultado) # Resultado: [1, 3, 5, 7]
En este ejemplo, el slice comienza en el índice 1, termina en el índice 8 (no inclusivo) y utiliza un paso de 2
, tomando cada segundo elemento desde el inicio hasta el final especificado.
Índices negativos al principio
Al utilizar índices negativos en el inicio del slice, se extraen elementos desde el final de la lista.
ultimos_tres = numeros[-3:] # Extrae los últimos tres elementos: [7, 8, 9]
En este caso, numeros[-3:]
crea un slice que incluye los últimos tres elementos de la lista numeros
.
Índices negativos al final
También es posible utilizar índices negativos al final del slice para definir el inicio desde el final de la lista.
sin_ultimos_tres = numeros[:-3] # Extrae todos los elementos excepto los últimos tres: [0, 1, 2, 3, 4, 5, 6]
Aquí, numeros[:-3]
crea un slice que incluye todos los elementos de la lista numeros
excepto los últimos tres.
Paso negativo
El uso de un paso negativo en el slice invierte el orden de los elementos extraídos.
invertido = numeros[::-1] # Invierte el orden de la lista: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Al especificar numeros[::-1]
, se crea un slice que comienza desde el último elemento hasta el primero, invirtiendo así el orden de la lista original.