No entiendo rebanar con negativo límites en Python.Cómo es esto supone trabajar?

StackOverflow https://stackoverflow.com/questions/493046

  •  20-08-2019
  •  | 
  •  

Pregunta

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

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

¿Por qué rebanar con ningún principio atado y un '-1' de regreso a cada elemento, excepto el último?Está llamando s[0:-1] lógicamente, el mismo que llamar a la s[:-1]?Ambos devuelven el mismo resultado.Pero no estoy seguro de lo que python está haciendo exactamente.Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Sí, llamando s[0:-1] es exactamente el mismo que el de llamar s[:-1].

El uso de un número negativo como un índice en python devuelve el n-ésimo elemento de la parte derecha de la lista (en oposición a la costumbre lado izquierdo).

así que si usted tiene una lista así:

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

la instrucción print imprimir "e".

Una vez que usted entienda que (los cuales puede que ya, no es del todo claro si esa es una de las cosas que usted está confundido o no), podemos empezar a hablar sobre la creación de divisiones.

Voy a asumir que usted entiende los fundamentos de una rebanada a lo largo de las líneas de myList[2:4] (sobre el que volveremos ['c', 'd']) y saltar directamente a la segmentación de la notación donde de un lado se deja en blanco.

Como usted sospecha que en tu post, myList[:index] es exactamente el mismo que myList[0:index].

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

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

Si no estás haciendo ya que me parece justo cachondeo en un intérprete de Python en un montón una gran ayuda para la comprensión de estas cosas.Recomiendo IPython.

Otros consejos

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

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

Del mismo modo, los índices negativos apuntan entre elementos, pero esta vez contando desde atrás, entonces -1 puntos entre el último elemento y el penúltimo, por lo que [0: -1] se refiere a un bloque de elementos que no incluido el último.

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) luego devuelve la 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 vuelvas apático sobre la lista.

  1. Escribe el primer elemento primero. Puedes usar índice positivo o negativo para eso. Soy flojo, así que uso positivo, un golpe menos (menos de 7, o -3 para empezar).
  2. Índice del elemento justo antes de donde quieres parar. Nuevamente, puede usar un índice positivo o negativo para eso (debajo de 2 o -8 para detener).
  3. Aquí el signo importa; por supuesto, para al revés; valor de zancada ya sabes. Stride es un 'vector' con magnitud y dirección (debajo de -1, todo al revé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]
    

    Todos los resultados 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 divisió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 optar por una indexación negativa. La indexación comienza desde -1.

Ejemplo: s = 'hola mundo'

s [-11: -1] = 'hola worl' s [-1: -11] = '' // el valor inicial debe ser menor (es decir, en este caso -1 mayor que -11) si es mayor, no imprimirá nada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top