2010-08-10 14 views
15

Así que he estado jugando con python y noté algo que parece un poco extraño. La semántica de -1 en la selección de una lista no parece ser consistente.Selección de lista/sublista de Python -1 rareza

así que tengo una lista de números

ls = range(1000) 

El último elemento de la lista si por supuesto ls[-1] pero si tomo una lista secundaria de ese modo que consiga todo, desde decir el punto medio hasta el final lo haría hacer

ls[500:-1] 

pero esto no me da una lista que contiene el último elemento de la lista, pero en lugar de una lista que contiene todo hasta el último elemento. Sin embargo, si lo hago

ls[0:10] 

consigo una lista que contiene también el décimo elemento (por lo que el selector debe ser incluido), ¿por qué entonces no funciona para -1.

Por supuesto puedo hacer ls[500:] o ls[500:len(ls)] (que sería una tontería). Me preguntaba cuál era el trato con -1, me doy cuenta de que no lo necesito allí.

Respuesta

50

En list[first:last], last no está incluido.

El 10º elemento es ls[9], en ls[0:10] no es ls[10].

4

me sale un comportamiento coherente para ambos casos:

>>> ls[0:10] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> ls[10:-1] 
[10, 11, 12, 13, 14, 15, 16, 17, 18] 

Tenga en cuenta, sin embargo, que el décimo elemento de la lista está en el índice , ya que la lista es indexada 0. Ese podría ser el lugar donde estás colgado.

En otras palabras, [0:10] no va del índice 0-10, efectivamente va de 0 al décimo elemento (lo que le da índices de 0-9, ya que el 10 no está incluido al final del segmento) .

1

Parece bastante consistente para mí; los índices positivos tampoco son inclusivos. Creo que lo estás haciendo mal. Recordando que range() también es no inclusiva, y que los arrays Python son 0-indexado, aquí es una sesión de pitón de muestra para ilustrar:

>>> d = range(10) 
>>> d 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> d[9] 
9 
>>> d[-1] 
9 
>>> d[0:9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> d[0:-1] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> len(d) 
10 
1

al rebanar una matriz;

ls[y:x] 

toma la porción del elemento y hasta, pero sin incluir x. cuando se utiliza la indexación negativa es equivalente a usar

ls[y:-1] == ls[y:len(ls)-1] 

por lo que lo que la rebanada sería hasta el último elemento, pero no sería incluirlo (según la rebanada)

2

-1 ISN No es especial en el sentido de que la secuencia se lee hacia atrás, más bien envuelve los extremos. Tal que menos uno significa cero menos uno, exclusivo (y, para un valor de paso positivo, la secuencia se lee "de izquierda a derecha".

así que para i = [1, 2, 3, 4], i[2:-1] significa de la partida de dos a el comienzo menos uno (o, 'en torno al extremo'), lo que resulta en [3]. El elemento -1th, o elemento de hacia atrás es la última 4, pero ya que es exclusiva, obtenemos 3.

espero que esto es algo comprensible.

10

Si desea obtener una lista sub incluyendo el último elemento, le dejan en blanco después de colon:

>>> ll=range(10) 
>>> ll 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> ll[5:] 
[5, 6, 7, 8, 9] 
>>> ll[:] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]