2009-04-19 37 views
32

ero alla ricerca di un modo per stampare una stringa all'indietro, e dopo una rapida ricerca su google, ho trovato questo metodo:invertire una stringa in Python

Supponiamo 'a' è una variabile stringa. Ciò restituirà la stringa "a" all'indietro:

a[::-1] 

Qualcuno può spiegare come funziona?

+0

** Si prega di seealso **: http: // StackOverflow .com/a/33457266/42223 che affronta questa caratteristica di Python che alcuni potrebbero trovare "eccentrico". – dreftymac

risposta

68

Certo, il [::] è l'operatore extended slice. Esso consente Fondamentalmente, funziona specificando quali elementi vuoi come [begin: end: step], e funziona per tutte le sequenze Due cose belle a riguardo:

  • È possibile omettere uno o più degli elementi e lo fa "la cosa giusta"
  • numeri negativi per inizio, fine, e passo hanno un significato

Per iniziare e finire, se si dà un numero negativo , significa contare dalla fine della sequenza.Ad esempio, se ho un elenco:

l = [1,2,3] 

Poi l[-1] è 3, l[-2] è 2, ed è l[-3] 1.

per l'argomento step, un numero negativo significa lavorare ritroso attraverso la sequenza. Così, per un elenco ::

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

Si potrebbe scrivere l[::-1] che in pratica significa usare un passo di -1 durante la lettura attraverso la lista. Python "farà la cosa giusta" quando riempie l'inizio e l'arresto in modo da scorrere l'elenco all'indietro e ti dà [10,9,8,7,6,5,4,3,2,1].

Ho dato gli esempi con le liste, ma le stringhe sono solo un'altra sequenza e funzionano allo stesso modo. Quindi, a[::-1] significa costruire una stringa unendo i personaggi che ottieni camminando all'indietro attraverso la corda.

+0

"La cosa giusta" può essere un po 'di confusione quando si utilizza un passo/passo negativo. [Esempio qui] (http://stackoverflow.com/q/399067/936083). – Darthfett

3

E' il extended slice notation:

sequence[start:end:step] 

In questo caso, un passo -1 significa indietro, e omettendo l'inizio e la fine significa che vuoi l'intera stringa.

7

La parte "-1" rappresenta la parte "step" dell'affettatura: in questo caso, passa attraverso la stringa 1 carattere alla volta, ma all'indietro (un passaggio negativo significa inizio dalla fine della stringa) . Se si specifica il passo per essere 2, ad esempio, si otterrà ogni altro carattere della stringa, iniziando dal primo. Se si specifica un passo di -2, si otterrà ogni altro carattere della stringa, iniziando dall'ultimo carattere e lavorando all'indietro.

Quindi, in poche parole, se a = '12345':

  • a[::2] diventa 135
  • a[::-1] diventa 54321
  • a[::-2] diventa 531
2

Sta usando affettare esteso - una stringa è una sequenza in Python e condivide alcuni metodi con altre sequenze (na mely liste e tuple). Ci sono tre parti da affettare: start, stop e step. Tutti hanno valori predefiniti - avvia i valori predefiniti su 0, ferma i valori predefiniti su len (sequenza) e imposta i valori predefiniti su 1. Specificando [:: - 1] stai dicendo "tutti gli elementi in sequenza a, partendo dall'inizio , al fine di andare all'indietro, uno alla volta.

Questa funzione è stata introdotta in Python 2.3.5, e si può leggere di più nel What's New docs.

2

[:: - 1] fornisce una porzione della stringa a. la sintassi completa è a[begin:end:step] che dà un [inizio], un [inizio + passaggio], ... un [fine-1]. Quando il passo è negativo, inizi alla fine e inizi a muoverti.

Infine, avvia i valori predefiniti all'inizio della sequenza, termina alla fine e passa a -1.

1

una stringa è essenzialmente una sequenza di caratteri e pertanto l'operazione di taglio funziona su di essa. Quello che stai facendo è in effetti:

-> ottenere una porzione di 'a' dall'inizio alla fine in passaggi di 1 indietro.

5

penso quanto segue rende un po 'più senso per le stringhe di stampa in senso inverso, ma forse è solo a me:

for char in reversed(myString): 
    print(char, end = "") 
+0

a cosa serve 'end = ""'? –

+0

È il modo in cui Python 3 non si rinnova alla fine di ogni stampa. In python 2.x, si può semplicemente scrivere print (char,) –

+0

Naturalmente, questo stampa la stringa; non crea una nuova stringa che è la vecchia stringa invertita ('' .join (reverse (myString)) lo farà, comunque). –

1

vorrei fare in questo modo:

variable = "string" 
message = "" 
for b in variable: 
    message = b+message 
print (message) 

e la stampa: gnirts

0

consideri la lista qui sotto

l=[12,23,345,456,67,7,945,467] 

Un altro trucco per invertire una lista può essere:

l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12] 

l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12] 

l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12] 
0

possiamo usare append e pop per farlo

def rev(s): 
    i = list(s) 
    o = list() 
    while len(i) > 0: 
     o.append(t.pop()) 

    return ''.join(o) 
+0

Perché suggeriresti un metodo alternativo per invertire una stringa quando l'OP voleva chiaramente sapere perché 'a [:: - 1]' funziona? – rayryeng

+0

Questa non è la risposta pertinente, per favore leggi di nuovo la domanda. – Aniruddha

1

E 'la notazione di base passo, prendere in considerazione la funzionalità di:

un [ 2: 4: 2]

Ciò che accade è l'indice diviso tra le posizioni 2 e 4, ciò che fa la terza variabile è che imposta la dimensione del passo a partire dal primo valore In questo caso restituirebbe un [2], poiché un [4] è un limite superiore, solo due valori vengono restituiti e non viene eseguito alcun secondo passaggio. L'operatore (-) meno inverte semplicemente l'uscita del passo.

0

senza usare invertito o [:: - 1], qui è una semplice versione base di ricorsione io considero essere il più leggibile:

def reverse(s): 

    if len(s)==2: 
    return s[-1] + s[0] 

    if len(s)==1: 
    return s[0] 

    return s[-1] + reverse(s[1:len(s)-1]) + s[0]