2010-08-10 4 views
15

Quindi ho giocato con python e ho notato qualcosa che mi sembra un po 'strano. La semantica di -1 nella selezione da un elenco non sembra essere coerente.Elenco Python/selezione sottolista -1 stranezza

quindi ho un elenco di numeri

ls = range(1000) 

L'ultimo elemento della lista, se ovviamente ls[-1] ma se prendo un elenco secondario di quel modo che io ottenere tutto da dire che il punto medio fino alla fine lo farei fare

ls[500:-1] 

ma questo non mi dà un elenco contenente l'ultimo elemento della lista, ma invece un elenco contenente tutto fino all'ultimo elemento. Tuttavia, se lo faccio

ls[0:10] 

ottengo una lista contenente anche l'elemento decima (quindi il selettore dovrebbe essere compreso), perché allora lo fa non funziona per -1.

Posso ovviamente fare ls[500:] o ls[500:len(ls)] (che sarebbe sciocco). Mi stavo chiedendo quale fosse l'accordo con -1, mi rendo conto che non ne ho bisogno.

risposta

50

In list[first:last], last non è incluso.

Il 10 elemento è ls[9], in ls[0:10] non c'è ls[10].

4

ottengo un comportamento coerente per entrambe le istanze:

>>> 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] 

nota, però, che decimo elemento della lista è indice , dal momento che la lista è 0-indicizzati. Potrebbe essere il punto in cui ti trovi.

In altre parole, [0:10] non passa dall'indice 0-10, passa effettivamente da 0 al decimo elemento (che ottiene gli indici da 0 a 9, poiché il 10 non è compreso alla fine della sezione) .

1

Mi sembra abbastanza coerente; gli indici positivi sono anche non inclusivi. Penso che tu stia sbagliando. Ricordando che range() è anche non inclusivo, e che gli array Python sono 0-indicizzato, ecco una sessione pitone esempio per illustrare:

>>> 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

quando affetta un array;

ls[y:x] 

prende la sezione dall'elemento y fino a ma senza includere x. quando si utilizza l'indicizzazione negativo è equivalente all'utilizzo

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

così così la fetta sarebbe fino l'ultimo elemento, ma non sarebbe includere (come per la fetta)

2

-1 isn Sono speciali nel senso che la sequenza viene letta all'indietro, piuttosto avvolge le estremità. Tale che meno uno significa zero meno uno, esclusivo (e, per un valore di passo positivo, la sequenza viene letta "da sinistra a destra".

così per i = [1, 2, 3, 4], i[2:-1] significa dalla voce due a all'inizio meno uno (o, 'intorno all'estremità'), che si traduce in [3]. L'elemento -1th, o elemento 0 indietro 1 è l'ultimo 4, ma dal momento che è esclusivo, otteniamo 3.

Spero che questo è in qualche modo comprensibile.

10

Se si desidera ottenere un elenco sub tra cui l'ultimo elemento, si lascia vuota dopo i due punti:

>>> 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]