Réponses:
Ne modifiez pas les chaînes.
Travaillez avec eux sous forme de listes; les transformer en chaînes uniquement lorsque cela est nécessaire.
>>> 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'
Les chaînes Python sont immuables (c'est-à-dire qu'elles ne peuvent pas être modifiées). Il y a beaucoup de raisons à cela. Utilisez des listes jusqu'à ce que vous n'ayez pas le choix, puis transformez-les en chaînes.
MID
cause des tranches:s[:index] + c + s[index+1:]
Il y a trois façons. Pour les amateurs de vitesse, je recommande la «méthode 2»
Méthode 1
Donné par cette réponse
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
Ce qui est assez lent par rapport à la «méthode 2»
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
Méthode 2 (MÉTHODE RAPIDE)
Donné par cette réponse
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
Ce qui est beaucoup plus rapide:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
Méthode 3:
Tableau d'octets:
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)
deux fois plus lente que la plus rapide.
new = text[:1] + 'Z' + text[2:]
Les chaînes Python sont immuables, vous les modifiez en faisant une copie.
La façon la plus simple de faire ce que vous voulez est probablement:
text = "Z" + text[1:]
Le text[1:]
retourne la chaîne text
de la position 1 à la fin, les positions comptent à partir de 0, donc «1» est le deuxième caractère.
edit: Vous pouvez utiliser la même technique de découpage de chaîne pour n'importe quelle partie de la chaîne
text = text[:1] + "Z" + text[2:]
Ou si la lettre n'apparaît qu'une fois que vous pouvez utiliser la technique de recherche et de remplacement suggérée ci-dessous
À partir de python 2.6 et python 3, vous pouvez utiliser des sous-tableaux qui sont mutables (peuvent être modifiés par élément contrairement aux chaînes):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
edit: str changé en s
edit2: Comme Two-Bit Alchemist l'a mentionné dans les commentaires, ce code ne fonctionne pas avec unicode.
bytearray(s)
, non bytearray(str)
. D'autre part , cela produira: TypeError: string argument without an encoding
. Si vous spécifiez un encodage, vous obtenez TypeError: an integer is required
. C'est avec Python 3 ou l'unicode de Python 2. Si vous faites cela en Python 2 (avec une deuxième ligne corrigée), cela ne fonctionnera pas pour les caractères non ASCII car ils peuvent ne pas être d'un seul octet. Essayez-le avec s = 'Héllo'
et vous obtiendrez 'He\xa9llo'
.
s = u'abcdefg'
.
Comme d'autres personnes l'ont dit, les chaînes Python sont généralement censées être immuables.
Cependant, si vous utilisez CPython, l'implémentation de python.org, il est possible d'utiliser des ctypes pour modifier la structure des chaînes en mémoire.
Voici un exemple où j'utilise la technique pour effacer une chaîne.
Marquer les données comme sensibles en python
Je le mentionne par souci d'exhaustivité, et cela devrait être votre dernier recours car il est hackish.
str
n'est pas le bon type pour vous. Ne l'utilisez pas. Utilisez quelque chose comme à la bytearray
place. (Mieux encore, enveloppez-le dans quelque chose qui vous permet de le traiter plus ou moins comme une donnée opaque afin que vous ne puissiez vraiment pas en récupérer un str
, pour vous protéger contre les accidents. Il pourrait y avoir une bibliothèque pour cela. Aucune idée.)
Ce code n'est pas le mien. Je ne me souvenais pas du formulaire du site où, je l'ai pris. Fait intéressant, vous pouvez l'utiliser pour remplacer un ou plusieurs caractères par un ou plusieurs charectors. Bien que cette réponse soit très tardive, les novices comme moi (à tout moment) pourraient la trouver utile.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Lien vers le doc
En fait, avec des chaînes, vous pouvez faire quelque chose comme ceci:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
Fondamentalement, j'ajoute des "+" chaînes "dans une nouvelle chaîne :).
si votre monde est à 100% ascii/utf-8
(beaucoup de cas d'utilisation tiennent dans cette case):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
python 3.7.3
Je voudrais ajouter une autre façon de changer un caractère dans une chaîne.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
À quel point est-il plus rapide que de transformer la chaîne en liste et de remplacer la ième valeur, puis de rejoindre à nouveau?.
Approche par liste
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
Ma solution
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526