No entiendo rebanar con límites negativos en Python. ¿Cómo se supone que esto funcione?

Soy un novato en Python y he encontrado el siguiente ejemplo en mi libro que no se explica muy bien. Aquí está mi impresión del intérprete:

>>> s = 'spam' >>> s[:-1] 'spa' 

¿Por qué rebanar sin un límite de inicio y un '-1' devuelve todos los elementos excepto el último? ¿Llamar a s[0:-1] lógicamente es lo mismo que llamar a s[:-1] ? Ambos devuelven el mismo resultado. Pero no estoy seguro de qué está haciendo exactamente python. Cualquier ayuda sería muy apreciada.

Sí, llamar a s[0:-1] es exactamente lo mismo que llamar a s[:-1] .

El uso de un número negativo como índice en python devuelve el elemento n desde el lado derecho de la lista (a diferencia del lado izquierdo habitual).

así que si tienes una lista como tal:

 myList = ['a', 'b', 'c', 'd', 'e'] print myList[-1] # prints 'e' 

la statement de impresión imprimirá “e”.

Una vez que entiendas eso (lo cual ya puedes hacer, no está del todo claro si esa es una de las cosas por las que estás confundido o no), podemos empezar a hablar sobre el corte en rodajas.

Voy a asumir que entiendes lo básico de una división a lo largo de las líneas de myList[2:4] (que devolverá ['c', 'd'] ) y saltará directamente a la notación de corte donde un lado queda en blanco .

Como sospechaste en tu publicación, myList[:index] es exactamente igual a myList[0:index] .

Esto también funciona al revés, por cierto … myList[index:] es el mismo que myList[index:len(myList)] y devolverá una lista de todos los elementos de la lista que comienzan en el index y siguen hasta el final (por ejemplo, print myList[2:] imprimirá ['c', 'd', 'e'] ).

Como tercera nota, incluso puede print myList[:] donde no se indica un índice, que básicamente devolverá una copia de la lista completa (equivalente a myList[0:len(myList)] , devuelve [‘a’, ‘ b ‘,’ c ‘,’ d ‘,’ e ‘]). Esto podría ser útil si cree que myList va a cambiar en algún momento, pero desea mantener una copia de la misma en su estado actual.

Si aún no lo estás haciendo, me parece que estar jugando con un intérprete de Python es una gran ayuda para entender estas cosas. Recomiendo IPython .

El punto crucial es que los índices de Python deben considerarse como indicadores de los espacios entre las entradas en una lista, en lugar de a los elementos en sí. Por lo tanto, 0 puntos al principio, 1 a entre el primero y segundo, … y n a entre el nth y (n + 1) st.

Por lo tanto, l [1: 2] te da una lista que contiene solo el elemento l [1], ya que te da todo entre los dos punteros.

De manera similar, los índices negativos apuntan entre los elementos, pero esta vez contando desde la parte posterior, por lo que -1 puntos entre el último elemento y el siguiente al último, por lo que [0: -1] se refiere a un bloque de elementos que no incluye el último uno.

Como azúcar sintáctica, puede dejar 0 desde el principio o, en efecto, el final, por lo que l [n:] se refiere a todo desde l [n] hasta el final (si n> = len (l), entonces devuelve el lista vacía).

 >>> l = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz&'] # I want a string up to 'def' from 'vwx', all in between # from 'vwx' so -2;to 'def' just before 'abc' so -9; backwards all so -1. >>> l[-2:-9:-1] ['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def'] # For the same 'vwx' 7 to 'def' just before 'abc' 0, backwards all -1 >>> l[7:0:-1] ['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def'] 

Por favor, no te pongas indiferente sobre la lista.

  1. Escribe el primer elemento primero. Puedes usar un índice positivo o negativo para eso. Soy perezoso, así que uso positivo, un golpe menos (por debajo de 7, o -3 para el inicio).
  2. Índice del elemento justo antes de donde desea detenerse. Nuevamente, puede usar un índice positivo o negativo para eso (por debajo de 2 o -8 para detener).
  3. Aquí el letrero importa; por supuesto – para atrás; Valor del paso que sabes. Stride es un ‘vector’ con magnitud y dirección (debajo de -1, todo hacia atrás).

     l = [0,1,2,3,4,5,6,7,8,9] l[7:2:-1], l[-3:2:-1], [-3:-8:-1],l[7:-8:-1] 

    Todo resulta en [7, 6, 5, 4, 3] .

Los índices negativos se cuentan desde el final, por lo que s [: – 1] es equivalente a s [: len (s) -1] y s [-1] es el último elemento, por ejemplo.

Sí, llamar a s[0:-1] es lógicamente lo mismo que s[:-1] ya que la segmentación se define mejor como:

 [beginning_index:ending_index] 

Python le permite omitir 0, ya que esto permite que su código sea más conciso.

Si queremos imprimir desde el back-end de la cadena, podemos ir a la indexación negativa. La indexación comienza desde -1.

Ejemplo: s = ‘hola mundo’

s [-11: -1] = ‘hello worl’ s [-1: -11] = ” // el valor inicial debe ser menor (es decir, en este caso -1 mayor que -11) si es mayor, ganó No imprima nada.