¿Qué es :: (dos dos puntos) en Python al suscribir secuencias?

Resuelto Aillyn asked hace 14 años • 11 respuestas

Sé que puedo usar algo como string[3:4]para obtener una subcadena en Python, pero ¿qué significa el 3 en somesequence[::3]?

Aillyn avatar Aug 11 '10 03:08 Aillyn
Aceptado

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

Adriano Varoli Piazza avatar Aug 10 '2010 20:08 Adriano Varoli Piazza

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.

deinst avatar Aug 10 '2010 20:08 deinst

seq[::n]es una secuencia de cada nelemento 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]
Yuval Adam avatar Aug 10 '2010 20:08 Yuval Adam

Explicación

s[i:j:k]es, según la documentación , "rebanada de s de i a j con el paso k". Cuando iy jestá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]
Bolo avatar Aug 10 '2010 20:08 Bolo