web-dev-qa-db-fra.com

Changer un caractère dans une chaîne dans Python

Quel est le moyen le plus simple dans Python de remplacer un caractère dans une chaîne?

Par exemple:

text = "abcdefg";
text[1] = "Z";
           ^
328
kostia

Ne modifiez pas les chaînes.

Travailler avec eux comme des listes; transformez-les en chaînes seulement 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 de raisons pour cela. Utilisez des listes jusqu'à ce que vous n'ayez plus le choix, puis transformez-les en chaînes.

456
scvalex

Méthode la plus rapide?

Il y a trois façons. Pour les chercheurs de vitesse, je recommande la "Méthode 2"

Méthode 1

Donné par ceci réponse

text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)

Ce qui est assez lent comparé à 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 ceci 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
162
Mehdi Nellen
new = text[:1] + 'Z' + text[2:]
123
Jochen Ritzel

Les chaînes Python sont immuables, vous les changez en les copiant.
La meilleure façon 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 comptant de 0 à '1' étant le deuxième caractère.

edit: vous pouvez utiliser la même technique de découpage en 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, vous pouvez utiliser la technique de recherche et de remplacement suggérée ci-dessous.

32
Martin Beckett

À partir de python 2.6 et de python 3, vous pouvez utiliser des tableaux auxiliaires qui sont mutables (ils peuvent être modifiés élément 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: Changé str en s

edit2: Comme mentionné dans les commentaires Alchemist Two-Bit, ce code ne fonctionne pas avec unicode.

12
Mahmoud

Comme d’autres personnes l’ont dit, les chaînes Python sont généralement supposées être immuables.

Toutefois, si vous utilisez CPython, l’implémentation sur 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 en python

Je mentionne cela dans un souci de complétude, et cela devrait être votre dernier recours car il est hack.

4
Unknown

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!'

En gros, je "ajoute" + "des chaînes" dans une nouvelle chaîne :).

1
user5587487

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 utiliser ceci pour remplacer un ou plusieurs personnages par un ou plusieurs charectors. Bien que cette réponse soit très tardive, les novices comme moi (à tout moment) pourraient la trouver utile.

Changer la fonction du texte.

mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
1
K.Vee.Shanker.