2012-06-27 11 views
5

Si tengo esta lista con 10 elementos:¿Por qué Python devuelve índices de lista negativa?

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

Por qué se l [10] devolver un IndexError, pero l [-1] devuelve 0?

>>> l[10] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list index out of range 
>>> l[0] 
1 
>>> l[-1] 
0 
>>> l[-2] 
9 

Lo que quiero hacer es arrojar un error si no hay elementos previos en la lista.

+0

¿Qué quiere decir con "ningún elemento anterior en la lista"? Si por "anterior" quiere decir "a la izquierda del elemento actual", la respuesta de Lattyware debería ser muy útil. Pero no puedo evitar preguntarme si te refieres a algo más. –

Respuesta

19

En Python, los índices de lista negativa indican elementos contados a la derecha de la lista (es decir, l[-n] es la abreviatura de l[len(l)-n]).

Si usted encuentra que necesita índices negativos para indicar un error, entonces puede simplemente comprobar si ese caso y elevar la excepción a sí mismo (o manejarlo en ese momento):

index = get_some_index() 
if index < 0: 
    raise IndexError("negative list indices are considered out of range") 
do_something(l[index]) 
+0

No estoy seguro de que me gusta IndexError, pero al menos ahora tiene un mensaje. Me sorprendería bastante si no pudiera obtener el último elemento con -1 cuando * sé * es una lista incorporada ... Además, el corte extendido necesita algo de trabajo en él ... –

+0

@JonClements No sugiero una subclase , por lo que la lista * no se comportará * de manera diferente, solo en el caso particular en el que no desee que los índices negativos sean posibles, trate con eso. –

2

Es porque l[-1] es igual a l[len(l)-1], de manera similar l[-2] es igual a l[len(l)-2]

>>> lis=[1,2,3,4,5] 
>>> lis[-1],lis[-2],lis[-3] 
(5, 4, 3) 
>>> lis[len(lis)-1],lis[len(lis)-2],lis[len(lis)-3] 
(5, 4, 3) 
1

Q: ¿Por qué va a devolver un l[10] n IndexError, pero l[-1] devuelve 0?

A: Porque los valores de índice en Python (como en muchos otros idiomas) son basados ​​en cero. Eso significa que el primer artículo se almacena en el índice 0.

Su lista

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

tiene 10 elementos. Dado que el índice comienza en 0, el último elemento estará en el índice 9. Cuando intenta acceder a su lista en el índice 10, Python correctamente lanza una excepción IndexError para decirle que este no es un valor de índice válido y está fuera de límites.

Python también utiliza la convención de valores de índice negativos para acceder a los elementos del "final" de una lista o secuencia. El valor del índice -1 indica el último elemento en la lista, -2 el penúltimo, etc. Como el último elemento en su lista es 0, esto es lo que l[-1] devuelve.

@ La respuesta de Lattyware ya le muestra cómo generar/lanzar una excepción, espero que esto responda a su pregunta inicial.

Cuestiones relacionadas