2014-09-17 11 views
5

Nel guardare alcune stringhe Python e funzioni, ho scoperto questo strano scherzo del pitone:Perché s [len (s) -1: -1: -1] non funziona?

s = "hello" 
print s[::-1] 

che poi stampe: olleh

Tuttavia, print s[len(s)-1:-1:-1] non funziona. La mia comprensione è che dovrebbe iterare dall'ultimo elemento s[len(s)-1] al primo elemento s[0]. Tuttavia, stampa solo una stringa vuota '', che credo sia dovuta a stringhe di una certa lunghezza (ad esempio 5), s[4] == s[-1]. Ma, non capisco perché Python decida di usare -1 invece di 4, che è l'attuale len(s).

Inoltre, s[len(s):0:-1] + s[0] opere. Perché len(s) è un indice valido? Python converte semplicemente len(s) a 0 arbitrariamente?

P.S. Questo è in Python 2.7.8, non sono sicuro se funziona anche in 3.xx

EDIT: confermato di essere la stessa in Python 3

risposta

5

La notazione fetta è questo:

s[start:stop:step] 

specificamente, stop essere all'altezza, ma non includerlo. Tradurre questo per quello che stai chiedendo:

s[len(s)-1:-1:-1] 

Questo è, in base alla lunghezza di 5 per 'hello'

s[4:-1:-1] 

o

s[4:4:-1] 

che è un vuoto, o zero stringa di lunghezza.


ho dato una molto più approfondita esposizione della fetta di notazione qui: Explain Python's slice notation

2

indici negativi vengono contati dalla fine della sequenza, quindi stai ottenendo solo [-1:-1:-1] o equivalentemente [4:4:-1] che è una stringa di lunghezza zero.

1

Ricordate che gli indici partono da 0, non 1.

[len(s)-1] ha l'ultima lettera ('o')

:-1 è solo 'o' di nuovo, perché stai ricevendo l'ultimo valore.

Quindi, quindi, si desidera passare dall'ultimo valore ... all'ultimo valore ... invertito (-1). Ovviamente questo restituirà una stringa vuota.

Per rispondere alla tua seconda domanda, è perché non ci sono errori mai sollevate quando si utilizza la notazione indice. Prova a fare print s[32489375:2784:-123]

1

si sta mappando all'indietro con un passo di uno negativo.Il valore predefinito è:

da 0 a len (raccolta) per passo

Quando si utilizza un passo negativo gli indici devono essere invertita pure, altrimenti andrai la strada più lunga . Ad esempio, from 0 to 5 by -1 diventa: 0 + -1 = -1; -1 + -1 = -2 ... qualche tempo dopo un numero intero trabocca ...)

Per evitare questa lunga passeggiata intorno pitone inverte gli indici quando step è negativo e tratta come:

da len (raccolta) a 0 dopo passo

questo significa che è necessario affrontare con i valori start e end in questo caso numeri interi come negative da len(collection) - quindi, se si vuole ottenere l'intera stringa in senso inverso, si sono alla ricerca di:

s[-1:-(len(s) + 1):-1] 

Oppure, in termini più semplici:

da {l'ultimo elemento della collezione} a {il primo elemento della collezione} da -1

This answer ha anche un buona spiegazione visiva per gli indici.