Changement d'un caractère dans une chaîne de caractères?
Quel est le moyen le plus simple en Python de remplacer un caractère dans une chaîne comme:
text = "abcdefg";
text[1] = "Z";
^
9 réponses
Ne modifiez pas les chaînes.
Travaillez avec eux en tant que listes; transformez-les en chaînes uniquement si 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 {[7] } de raisons à cela. Utilisez des listes jusqu'à ce que vous n'ayez pas le choix, seulement ensuite les transformer en chaînes.
Méthode la plus rapide?
Il y a trois façons. Pour les amateurs de vitesse, je recommande 'Méthode 2'
Méthode 1
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)
Cette réponse
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
, 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
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 texte [1:] renvoie la chaîne dans le texte de la position 1 à la fin, les positions comptent à partir de 0 donc ' 1 ' est le deuxième caractère.
Modifier: Vous pouvez utiliser la même technique de tranchage 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
En commençant par Python 2.6 et python 3, vous pouvez utiliser des bytearrays qui sont mutables (peuvent être modifiés en fonction des éléments contrairement aux chaînes):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
Modifier: changé str à s
Edit2: comme alchimiste à deux bits mentionné dans les commentaires, ce code ne fonctionne pas avec unicode.
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 à python.org, il est possible d'utiliser ctypes pour modifier la structure de chaîne en mémoire.
Voici un exemple où j'utilise la technique pour effacer une chaîne.
Marquer les données comme sensibles dans python
Je mentionne cela par souci d'exhaustivité, et cela devrait être votre dernier recours car il est hackish.
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, je "ajoute" + "strings" ensemble dans une nouvelle chaîne :).
Ce code n'est pas le mien. Je ne pouvais pas me rappeler la forme du site où, je l'ai pris. Fait intéressant, vous pouvez l'utiliser pour remplacer un caractère ou plus par un ou plusieurs charectors. Bien que cette réponse soit très tardive, les novices comme moi (à tout moment) pourraient le trouver utile.
Modifier la fonction de texte.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
Un moyen très simple est de faire ceci:
word = "Heloo World!"
word = word.replace(word[3], "l", 1)
print word
Sortie:
Hello World!