Comment puis-je supprimer toutes les occurrences d'un caractère dans cette chaîne? Voici mon code:
def findreplace(char, string):
place = string.index(char)
string[place] = ''
return string
Cependant, si je lance ceci, voici ce qui se passe:
>>> findreplace('i', 'it is icy')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in findreplace
TypeError: 'str' object does not support item assignment
Pourquoi est-ce?
Les chaînes sont immuables en Python, ce qui signifie qu'une fois qu'une chaîne est créée, vous ne pouvez pas en modifier le contenu. Le cas échéant, vous devez le modifier, une nouvelle instance de la chaîne sera créée avec les modifications.
Ayant cela à l'esprit, nous avons tellement de façons de résoudre ce problème
En utilisant str.replace
,
>>> "it is icy".replace("i", "")
't s cy'
En utilisant str.translate
,
>>> "it is icy".translate(None, "i")
't s cy'
En utilisant une expression régulière,
>>> import re
>>> re.sub(r'i', "", "it is icy")
't s cy'
En utilisant la compréhension comme filtre,
>>> "".join([char for char in "it is icy" if char != "i"])
't s cy'
Utilisation de la fonction filter
>>> "".join(filter(lambda char: char != "i", "it is icy"))
't s cy'
Comparaison des délais
def findreplace(m_string, char):
m_string = list(m_string)
for k in m_string:
if k == char:
del(m_string[m_string.index(k)])
return "".join(m_string)
def replace(m_string, char):
return m_string.replace("i", "")
def translate(m_string, char):
return m_string.translate(None, "i")
from timeit import timeit
print timeit("findreplace('it is icy','i')", "from __main__ import findreplace")
print timeit("replace('it is icy','i')", "from __main__ import replace")
print timeit("translate('it is icy','i')", "from __main__ import translate")
Résultat
1.64474582672
0.29278588295
0.311302900314
str.replace
et str.translate
méthodes sont 8 et 5 fois plus rapides que la réponse acceptée.
Remarque: La méthode de compréhension et les méthodes de filtrage devraient être plus lentes, dans ce cas, car elles doivent créer une liste et ensuite ils doivent être traversés à nouveau pour construire une chaîne. Et re
est un peu excessif pour un remplacement à un seul caractère. Donc, ils sont tous exclus de la comparaison temporelle.
Essayez str.replace()
:
str="it is icy"
print str.replace("i", "")
>>> x = 'it is icy'.replace('i', '', 1)
>>> x
't is icy'
Puisque votre code ne remplacerait que la première instance, j'ai supposé que c'était ce que vous vouliez. Si vous voulez tous les remplacer, laissez le 1
argument.
Comme vous ne pouvez pas remplacer le caractère dans la chaîne elle-même, vous devez le réaffecter à la variable. (Vous devez essentiellement mettre à jour la référence au lieu de modifier la chaîne.)
La méthode replace()
fonctionnera pour cela. Voici le code qui aidera à supprimer le caractère de la chaîne. Disons
j_Word = 'Stringtoremove'
Word = 'String'
for letter in Word:
if j_Word.find(letter) == -1:
continue
else:
# remove matched character
j_Word = j_Word.replace(letter, '', 1)
#Output
j_Word = "toremove"
Je suggère de scinder (ne pas dire que les autres réponses sont invalides, c'est juste une autre façon de le faire):
def findreplace(char, string):
return ''.join(string.split(char))
La scission par un caractère supprime tous les caractères et en fait une liste. Ensuite, nous rejoignons la liste avec la fonction join. Vous pouvez voir le test de la console ipython ci-dessous
In[112]: findreplace('i', 'it is icy')
Out[112]: 't s cy'
Et la vitesse ...
In[114]: timeit("findreplace('it is icy','i')", "from __main__ import findreplace")
Out[114]: 0.9927914671134204
Pas aussi vite que remplacer ou traduire, mais ok.
# s1 == source string
# char == find this character
# repl == replace with this character
def findreplace(s1, char, repl):
s1 = s1.replace(char, repl)
return s1
# find each 'i' in the string and replace with a 'u'
print findreplace('it is icy', 'i', 'u')
# output
''' ut us ucy '''