2009-04-19 24 views
32

szukałem sposobu, aby drukować ciąg do tyłu, a po szybkim wyszukiwaniu w Google, znalazłem tą metodą:odwrócić ciąg w Pythonie

Załóżmy „a” jest zmienną łańcuchową. Spowoduje to przywrócenie ciągu znaków "a":

a[::-1] 

Czy ktoś może wyjaśnić, jak to działa?

+0

** Proszę SeeAlso **: http: // stackoverflow .com/a/33457266/42223, który adresuje tę funkcję Pythona, którą niektórzy mogą uznać za "dziwaczny". – dreftymac

Odpowiedz

68

Pewny, [::] jest operatorem extended slice. to pozwala do podjęcia podciągów.Zasadniczo działa poprzez określenie, które elementy chcesz jako [początek: koniec: krok], i działa dla wszystkich sekwencji.Dwa schludny rzeczy:

  • Można pominąć jeden lub więcej elementów i to robi „słusznie”
  • liczb ujemnych na początek, koniec i krok ma znaczenie

Na początek i koniec, jeśli daje liczbę ujemną , to znaczy liczyć od końca sekwencji.Na przykład, jeśli mam listę:

l = [1,2,3] 

Następnie l[-1] wynosi 3, l[-2] wynosi 2, a l[-3] to 1.

Dla step argumentu liczba ujemna oznacza pracować wstecz poprzez sekwencja. Tak na liście ::

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

Można napisać l[::-1] co zasadniczo oznacza użycie wielkość kroku -1 podczas czytania poprzez listy. Python "zrobi to, co trzeba" podczas wypełniania startu i zatrzymania, więc iteruje listę do tyłu i daje [10,9,8,7,6,5,4,3,2,1].

Podałem przykłady z listami, ale ciągi są kolejną sekwencją i działają w ten sam sposób. Tak więc a[::-1] oznacza zbudować ciąg znaków, łącząc znaki, które otrzymujesz, przechodząc wstecz przez ciąg.

+0

"Właściwa rzecz" może być nieco myląca, gdy używasz ujemnego kroku/kroku. [Przykład tutaj] (http://stackoverflow.com/q/399067/936083). – Darthfett

3

To extended slice notation:

sequence[start:end:step] 

W tym przypadku, krok -1 oznacza wstecz, a pomijanie początku i końca oznacza, że ​​chcesz cały ciąg.

7

Część "-1" reprezentuje "krokową" część krojenia - w tym przypadku przechodzi przez ciąg 1 znak na raz, ale do tyłu (ujemny krok oznacza początek od końca łańcucha) . Jeśli na przykład określisz krok na 2, otrzymasz każdy inny znak ciągu, zaczynając od pierwszego. Jeśli podasz krok -2, otrzymasz wszystkie inne znaki ciągu, zaczynając od ostatniego znaku i pracując wstecz.

Tak w skrócie, jeśli a = '12345':

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

jest za pomocą rozszerzonego krojenia - ciąg jest ciągiem w Pythonie i dzieli niektóre metody z innymi sekwencjami (np listy i krotki). Są trzy części do krojenia - start, stop i step. Wszystkie z nich mają domyślne wartości - domyślne wartości rozpoczynają się od 0, zatrzymują się domyślnie len (sekwencja), a domyślny krok to 1. Poprzez określenie [:: - 1] mówisz "wszystkie elementy w sekwencji a, zaczynając od początku , do końca będzie do tyłu jednym naraz.

Ta funkcja została wprowadzona w Pythonie 2.3.5 i można przeczytać więcej w What's New docs.

2

[:: - 1] podaje kawałek ciągu a. pełna składnia to: [begin], a [begin + step], ... a [end-1]. Kiedy krok jest ujemny, zaczynasz od końca i ruszasz, by zacząć.

Na koniec rozpocznij ustawienia domyślne od początku sekwencji, od końca do końca i od kroku do -1.

1

ciąg jest zasadniczo ciągiem znaków, więc operacja krojenia działa na nim. To, co teraz robisz, jest w rzeczywistości:

-> pobierz kawałek "a" od początku do końca krokami 1 do tyłu.

5

myślę dodaje sprawia nieco więcej sensu dla ciągów drukowania w odwrotnej kolejności, ale może to tylko ja:

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

do czego służy ten "koniec =" ""? –

+0

To jest python 3 sposób nie dodawania nowych linii na końcu każdego wydruku. W python 2.x, możesz napisać print (char,) –

+0

Oczywiście, to wypisuje ciąg; nie tworzy nowego ciągu, który jest starym odwrócony łańcuch (".join (reverse (myString)) zrobi to jednak). –

1

zrobiłbym to tak:

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

i drukuje: gnirts

0

Rozważmy poniższą listę

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

Inną sztuczką dla odwrócenia listę mogą być:

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

możemy użyć append i pop to zrobić

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

    return ''.join(o) 
+0

Dlaczego zaproponowałbyś alternatywną metodę odwrócenia łańcucha, gdy OP wyraźnie chciał wiedzieć, dlaczego "a [:: - 1]" działa? – rayryeng

+0

To nie jest odpowiednia odpowiedź, proszę ponownie przeczytać pytanie. – Aniruddha

1

To podstawowy zapis krok, należy rozważyć funkcjonalność:

a [ 2: 4: 2]

Co się dzieje, że indeks jest krojony między pozycjami 2 i 4, co robi trzecia zmienna, ustawia rozmiar kroku zaczynając od pierwsza wartość. W takim przypadku zwróciłaby [2], ponieważ a [4] to górny limit, zwracane są tylko dwie wartości i nie ma drugiego kroku. Operator (-) minus po prostu odwraca wynik kroku.

0

bez użycia odwrócone lub [:: - 1], tutaj jest prosta wersja opiera się na rekurencji i uznałby za najbardziej czytelny:

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]