¿Qué es :: (dos dos puntos) en Python al suscribir secuencias?
Sé que puedo usar algo como string[3:4]
para obtener una subcadena en Python, pero ¿qué significa el 3 en somesequence[::3]
?
significa "nada para el primer argumento, nada para el segundo, y salta por tres". Obtiene cada tercer elemento de la secuencia cortado. Rebanadas extendidas es lo que quieres. Nuevo en Python 2.3
Las direcciones de fragmentos de secuencia de Python se pueden escribir a[start:end:step]
y se pueden descartar cualquiera de las de inicio, parada o final. a[::3]
es cada tercer elemento de la secuencia.
seq[::n]
es una secuencia de cada n
elemento de la secuencia completa.
Ejemplo:
>>> range(10)[::2]
[0, 2, 4, 6, 8]
La sintaxis es:
seq[start:end:step]
Entonces puedes hacer (en Python 2):
>>> range(100)[5:18:2]
[5, 7, 9, 11, 13, 15, 17]
Explicación
s[i:j:k]
es, según la documentación , "rebanada de s de i a j con el paso k". Cuando i
y j
están ausentes, se asume la secuencia completa y, por lo tanto, s[::k]
significa "cada k-ésimo elemento".
Ejemplos
Primero, inicialicemos una lista:
>>> s = range(20)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Tomemos cada tercer elemento de s
:
>>> s[::3]
[0, 3, 6, 9, 12, 15, 18]
Tomemos cada tercer elemento de s[2:]
:
>>> s[2:]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> s[2::3]
[2, 5, 8, 11, 14, 17]
Tomemos cada tercer elemento de s[5:12]
:
>>> s[5:12]
[5, 6, 7, 8, 9, 10, 11]
>>> s[5:12:3]
[5, 8, 11]
Tomemos cada tercer elemento de s[:10]
:
>>> s[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s[:10:3]
[0, 3, 6, 9]