Invertir una lista usando notación de segmento

en el siguiente ejemplo:

foo = ['red', 'white', 'blue', 1, 2, 3] 

donde: foo[0:6:1] imprimirá todos los elementos en foo. Sin embargo, foo[6:0:-1] omitirá el primer o el 0º elemento.

 >>> foo[6:0:-1] [3, 2, 1, 'blue', 'white'] 

Entiendo que puedo usar foo.reverse () o foo [:: – 1] para imprimir la lista al revés, pero trato de entender por qué foo [6: 0: -1] no imprime la lista completa ?

La notación de la rebanada en resumen:

 [  :  :  ] 

Si desea incluir el primer elemento al invertir una lista, deje el elemento intermedio en blanco, como este:

 foo[::-1] 

También puede encontrar una buena información sobre los cortes de Python en general aquí:
Explique la notación de corte de Python.

Si tiene problemas para recordar la notación de corte, puede intentar hacer el Hokey Cokey :

[ In : Out : sacude todo sobre ]

[Primer elemento para incluir: Primer elemento que se debe omitir : El paso a utilizar]

YMMV

… ¿por qué foo [6: 0: -1] no imprime la lista completa?

Porque el valor medio es el valor de parada exclusivo , en lugar de inclusivo. La notación de intervalo es [inicio, parada].

Así es exactamente como funciona el rango [x]:

 >>> range(6, 0, -1) [6, 5, 4, 3, 2, 1] 

Esos son los índices que se incluyen en su lista resultante y no incluyen 0 para el primer elemento.

 >>> range(6, -1, -1) [6, 5, 4, 3, 2, 1, 0] 

Otra forma de verlo es:

 >>> L = ['red', 'white', 'blue', 1, 2, 3] >>> L[0:6:1] ['red', 'white', 'blue', 1, 2, 3] >>> len(L) 6 >>> L[5] 3 >>> L[6] Traceback (most recent call last): File "", line 1, in  IndexError: list index out of range 

El índice 6 está más allá (un pasado, precisamente) de los índices válidos para L, por lo que excluyéndolo del rango como el valor de parada excluido:

 >>> range(0, 6, 1) [0, 1, 2, 3, 4, 5] 

Todavía le da índices para cada elemento de la lista.

Esta respuesta puede estar un poco desactualizada, pero podría ser útil para alguien que se haya quedado con el mismo problema. Puede obtener la lista inversa con un final arbitrario: hasta 0 índices, aplicando la segunda porción in situ como esta:

 >>> L = list(range(10)) >>> L [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> (start_ex, end) = (7, 0) >>> L[end:start_ex][::-1] [6, 5, 4, 3, 2, 1, 0] 

Utilizar

 >>>foo[::-1] 

Esto muestra el reverso de la lista desde el elemento final hasta el inicio,