2014-09-17 6 views
5

In an einigen Python-Strings und Funktionen suchen, entdeckte ich dieses seltsame Marotte von Python:Warum funktioniert s [len (s) -1: -1: -1] nicht?

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

die dann druckt: olleh

jedoch print s[len(s)-1:-1:-1] funktioniert nicht. Mein Verständnis ist, dass es vom letzten Element s[len(s)-1] zum ersten Element s[0] iterieren sollte. Es wird jedoch nur eine leere Zeichenfolge '' gedruckt, die ich glaube, weil in Strings bestimmter Länge (etwa 5), ​​s[4] == s[-1]. Aber ich verstehe nicht, warum Python entscheidet, -1 statt 4 zu verwenden, die die tatsächliche len(s) ist.

Darüber hinaus funktioniert s[len(s):0:-1] + s[0] funktioniert. Warum ist len(s) ein gültiger Index? Konvertiert Python einfach len(s) in 0 beliebig?

P.S. Dies ist in Python 2.7.8, ich bin nicht sicher, ob es funktioniert auch in 3.xx

EDIT: Bestätigt in Python gleich seine 3

Antwort

5

Die Scheibe Notation ist dies:

s[start:stop:step] 

Insbesondere stop ist bis zu, aber einschließlich es nicht. Übersetzen dies zu, was Sie fragen:

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

Dies ist, bezogen auf die Länge von 5 für 'hello'

s[4:-1:-1] 

oder

s[4:4:-1] 

, die eine leere oder null- Länge Zeichenfolge.


Ich habe eine viel tiefer gehende Darstellung der Scheibe Notation hier gegeben: Explain Python's slice notation

2

Negativ Indizes aus dem Ende der Sequenz gezählt, Sie erhalten also nur [-1:-1:-1], oder gleichwertig [4:4:-1], die Nulllänge Zeichenfolge ist.

1

Denken Sie daran, dass Indizes bei 0 beginnen, nicht 1.

[len(s)-1] bekommt den letzten Buchstaben ('o')

:-1 ist nur 'o' wieder, weil Sie den letzten Wert erhalten.

Sie wollen also vom letzten Wert ... zum letzten Wert gehen ... umgekehrt (-1). Natürlich wird das eine leere Zeichenfolge zurückgeben.

Um Ihre zweite Frage zu beantworten, liegt das daran, dass bei der Indexnotation keine Fehler auftreten. Versuchen Sie es mit print s[32489375:2784:-123]

1

Sie zeichnen rückwärts mit einem negativen Schritt.Der Standardwert ist:

von 0 bis len (Sammlung) von Schritt

Wenn Sie einen negativen Schritt die Indizes müssen auch umgekehrt werden, sonst werden Sie den langen Weg gehen rund . Zum Beispiel geht from 0 to 5 by -1 geht: 0 + -1 = -1; -1 + -1 = -2 ... einige Zeit später eine ganze Zahl überläuft ...)

Um diesen langen Weg um Python zu vermeiden, kehrt die Indizes wenn step negativ ist und behandelt sie als:

aus len (Sammlung) 0 Schritt

das bedeutet, dass Sie mit den start und end Werte in diesem Fall als negative ganze Zahlen von len(collection) befassen müssen - so, wenn Sie die gesamte Zeichenkette in umgekehrter erhalten möchten, die Sie suchen:

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

Oder einfacher ausgedrückt:

aus {das letzte Element in der Sammlung} zu {dem ersten Element in der Auflistung} von -1

This answer hat auch eine gute visuelle Erklärung für die Indizes.