Antworten:
Ändern Sie keine Zeichenfolgen.
Arbeiten Sie mit ihnen als Listen; Verwandeln Sie sie nur bei Bedarf in Zeichenfolgen.
>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'
Python-Strings sind unveränderlich (dh sie können nicht geändert werden). Dafür gibt es viele Gründe. Verwenden Sie Listen, bis Sie keine andere Wahl haben, und verwandeln Sie sie erst dann in Zeichenfolgen.
MID
wegen Scheiben:s[:index] + c + s[index+1:]
Es gibt drei Möglichkeiten. Für die Geschwindigkeitssucher empfehle ich 'Methode 2'
Methode 1
Gegeben durch diese Antwort
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
Was im Vergleich zu 'Methode 2' ziemlich langsam ist.
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
Methode 2 (SCHNELLE METHODE)
Gegeben durch diese Antwort
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
Welches ist viel schneller:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
Methode 3:
Byte-Array:
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
doppelt so langsam wie die schnellste.
Python-Strings sind unveränderlich. Sie ändern sie, indem Sie eine Kopie erstellen.
Der einfachste Weg, um das zu tun, was Sie wollen, ist wahrscheinlich:
text = "Z" + text[1:]
Das text[1:]
gibt die Zeichenfolge text
von Position 1 bis zum Ende zurück. Die Positionen zählen von 0, sodass '1' das zweite Zeichen ist.
Bearbeiten: Sie können für jeden Teil der Zeichenfolge dieselbe Technik zum Schneiden von Zeichenfolgen verwenden
text = text[:1] + "Z" + text[2:]
Wenn der Buchstabe nur einmal angezeigt wird, können Sie die unten vorgeschlagene Such- und Ersetzungstechnik verwenden
Ab Python 2.6 und Python 3 können Sie veränderbare Bytearrays verwenden (die im Gegensatz zu Strings elementweise geändert werden können):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
edit: str wurde in s geändert
edit2: Wie der Zwei-Bit-Alchemist in den Kommentaren erwähnt hat, funktioniert dieser Code nicht mit Unicode.
bytearray(s)
nicht sein bytearray(str)
. Zum anderen wird dies ergeben : TypeError: string argument without an encoding
. Wenn Sie eine Codierung angeben, erhalten Sie TypeError: an integer is required
. Das ist mit Python 3 oder Python 2 Unicode. Wenn Sie dies in Python 2 (mit einer korrigierten zweiten Zeile) tun, funktioniert dies nicht für Nicht-ASCII-Zeichen, da diese möglicherweise nicht nur ein Byte lang sind. Probieren Sie es aus s = 'Héllo'
und Sie werden bekommen 'He\xa9llo'
.
s = u'abcdefg'
.
Wie andere Leute gesagt haben, sollten Python-Strings im Allgemeinen unveränderlich sein.
Wenn Sie jedoch CPython verwenden, die Implementierung auf python.org, können Sie mit ctypes die Zeichenfolgenstruktur im Speicher ändern.
Hier ist ein Beispiel, in dem ich die Technik verwende, um eine Zeichenfolge zu löschen.
Markieren Sie Daten in Python als vertraulich
Ich erwähne dies der Vollständigkeit halber, und dies sollte Ihr letzter Ausweg sein, da es hackisch ist.
str
ist dies nicht der richtige Typ für Sie. Benutze es einfach nicht. Verwenden Sie bytearray
stattdessen so etwas wie . (Besser noch, wickeln Sie es in etwas ein, mit dem Sie es mehr oder weniger als undurchsichtige Daten behandeln können, sodass Sie wirklich keine Daten abrufen str
können, um sich vor Unfällen zu schützen. Möglicherweise gibt es dafür eine Bibliothek. Keine Ahnung.)
Dieser Code gehört nicht mir. Ich konnte mich nicht an das Site-Formular erinnern, wo ich es genommen habe. Interessanterweise können Sie damit ein oder mehrere Zeichen durch ein oder mehrere Zeichen ersetzen. Obwohl diese Antwort sehr spät ist, könnten Anfänger wie ich (jederzeit) sie nützlich finden.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Link zu doc
Mit Strings können Sie tatsächlich Folgendes tun:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
Grundsätzlich "addiere" ich + "Strings" zu einem neuen String :).
Wenn Ihre Welt zu 100% ist ascii/utf-8
(viele Anwendungsfälle passen in diese Box):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
Python 3.7.3
Ich möchte eine andere Möglichkeit hinzufügen, ein Zeichen in einer Zeichenfolge zu ändern.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
Wie schnell ist es im Vergleich dazu, die Zeichenfolge in eine Liste umzuwandeln und den i-ten Wert zu ersetzen und dann wieder zu verbinden?
Listenansatz
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
Meine Lösung
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526