Gibt es eine Möglichkeit, eine Zeichenfolge in Python zu unterzeichnen, um eine neue Zeichenfolge vom dritten Zeichen bis zum Ende der Zeichenfolge abzurufen?
Vielleicht wie myString[2:end]
?
Wenn das Verlassen des zweiten Teils "bis zum Ende" bedeutet und wenn Sie den ersten Teil verlassen, beginnt er von vorne?
Antworten:
Python nennt dieses Konzept "Slicing" und es funktioniert nicht nur mit Strings. Werfen Sie einen Blick hier für eine umfassende Einführung.
quelle
Nur der Vollständigkeit halber, wie es noch niemand erwähnt hat. Der dritte Parameter für ein Array-Slice ist ein Schritt. Das Umkehren einer Zeichenfolge ist also so einfach wie:
Oder Sie wählen alternative Zeichen aus:
Die Fähigkeit, vorwärts und rückwärts durch die Zeichenfolge zu gehen, gewährleistet die Konsistenz mit der Möglichkeit, Slice von Anfang oder Ende anzuordnen.
quelle
Substr () funktioniert normalerweise (dh PHP und Perl) folgendermaßen:
Die Parameter sind also
beginning
undLENGTH
.Aber Pythons Verhalten ist anders; es erwartet Anfang und eins nach ENDE (!). Dies ist für Anfänger schwer zu erkennen. Der richtige Ersatz für Substr (s, Anfang, LÄNGE) ist also
quelle
s[beginning:][:length]
Ein üblicher Weg, um dies zu erreichen, ist das Schneiden von Schnüren.
MyString[a:b]
gibt Ihnen einen Teilstring von Index a bis (b - 1).quelle
Ein Beispiel scheint hier zu fehlen: vollständige (flache) Kopie.
Dies ist eine gebräuchliche Redewendung zum Erstellen einer Kopie von Sequenztypen (nicht von internierten Zeichenfolgen)
[:]
. Flach kopiert eine Liste, siehe Python-Listen-Slice-Syntax, die ohne ersichtlichen Grund verwendet wird .quelle
a=b
sollte ausreichen.[:]
auf einem unveränderlichen Typ überhaupt keine Kopie. Währendmysequence[:]
meist harmlos ist , wennmysequence
ein unveränderlicher Typ wie iststr
,tuple
,bytes
(PY3) oderunicode
(Py2)a = b[:]
entsprichta = b
, es verschwendet nur eine wenig Zeit den Slicing - Byte - Codes Dispatching zu dem das Objekt reagiert , indem er selbst der sinnlos flache Kopie , da er zurückkehrt , wenn Abgesehen von Objektidentitätstests ist es gleichbedeutend, nur einen weiteren Verweis auf das unveränderliche Selbst zurückzugeben.s[:]
überhaupt keine Kopie :s = 'abc'; s0 = s[:]; assert s is s0
. Ja, es war die idiomatische Methode, eine Liste in Python zu kopieren, bis Listen verfügbar sindlist.copy
, aber ein vollständiges Segment eines unveränderlichen Typs hat keinen Grund, eine Kopie zu erstellen, da es nicht geändert werden kann. Daher kann es auch nur eine im Speicher und geben Wir sollten keine Zeit damit verschwenden, es zu kopieren. Da diese Antwort falsch ist und die Frage nicht einmal beantwortet - sollte sie gelöscht werden?Ja, dies funktioniert tatsächlich, wenn Sie den Namen einem konstanten Singleton zuweisen oder binden :
end
None
Die Slice-Notation hat 3 wichtige Argumente:
Ihre Standardeinstellungen sind, wenn sie nicht angegeben sind
None
- aber wir können sie explizit übergeben:Ja zum Beispiel:
Beachten Sie, dass wir Start in das Slice aufnehmen, aber nur bis zum Stopp und nicht bis zum Stopp.
Wenn Schritt ist
None
, wird standardmäßig das Slice1
für den Schritt verwendet. Wenn Sie mit einer negativen Ganzzahl arbeiten, ist Python intelligent genug, um vom Ende zum Anfang zu gelangen.Ich erkläre die Slice-Notation in meiner Antwort auf die Frage zur Erläuterung der Slice-Notation ausführlich .
quelle
Sie haben es genau dort, bis auf "Ende". Es heißt Slice-Notation. Ihr Beispiel sollte lauten:
Wenn Sie den zweiten Parameter weglassen, ist dies implizit das Ende der Zeichenfolge.
quelle
Ich möchte der Diskussion zwei Punkte hinzufügen:
Sie können
None
stattdessen auf einem leeren Feld "von Anfang an" oder "bis zum Ende" angeben:Dies ist besonders hilfreich bei Funktionen, bei denen Sie kein leeres Leerzeichen als Argument angeben können:
Python hat Slice- Objekte:
quelle
Wenn myString eine Kontonummer enthält, die bei Offset 6 beginnt und die Länge 9 hat, können Sie die Kontonummer folgendermaßen extrahieren :
acct = myString[6:][:9]
.Wenn das OP dies akzeptiert, möchten sie möglicherweise experimentell versuchen,
Es funktioniert - es wird kein Fehler ausgelöst und es tritt kein Standard-String-Padding auf.
quelle
myString[offset:][:length]
im Fall von OP verwendenmyString[offset:][:]
Vielleicht habe ich es verpasst, aber ich konnte auf dieser Seite keine vollständige Antwort auf die ursprüngliche (n) Frage (n) finden, da Variablen hier nicht weiter behandelt werden. Also musste ich weiter suchen.
Da ich noch keinen Kommentar abgeben darf, möchte ich hier meine Schlussfolgerung hinzufügen. Ich bin sicher, ich war nicht der einzige, der daran interessiert war, als ich auf diese Seite zugegriffen habe:
Wenn Sie den ersten Teil verlassen, erhalten Sie
Und wenn Sie das: auch in der Mitte gelassen haben, haben Sie den einfachsten Teilstring, der das 5. Zeichen wäre (Zählung beginnend mit 0, also in diesem Fall das Leerzeichen):
quelle
Nun, ich hatte eine Situation, in der ich ein PHP-Skript in Python übersetzen musste, und es hatte viele Verwendungsmöglichkeiten
substr(string, beginning, LENGTH)
.Wenn ich mich für Pythons entschieden
string[beginning:end]
hätte, müsste ich viele Endindizes berechnen. Der einfachere Weg war alsostring[beginning:][:length]
, mir viel Ärger zu ersparen.quelle
Die Verwendung von fest codierten Indizes selbst kann ein Chaos sein.
Um dies zu vermeiden, bietet Python ein integriertes Objekt an
slice()
.Wenn wir wissen wollen, wie viel Geld ich noch habe.
Normale Lösung:
Scheiben verwenden:
Mit Slice erhalten Sie Lesbarkeit.
quelle