web-dev-qa-db-fra.com

Comment supprimer toutes les occurrences d'un caractère dans une chaîne en python?

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?

57
user3367523

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

  1. En utilisant str.replace ,

    >>> "it is icy".replace("i", "")
    't s cy'
    
  2. En utilisant str.translate ,

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  3. En utilisant une expression régulière,

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  4. En utilisant la compréhension comme filtre,

    >>> "".join([char for char in "it is icy" if char != "i"])
    't s cy'
    
  5. 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.

112
thefourtheye

Essayez str.replace():

str="it is icy"
print str.replace("i", "")
3
Blue Ice
>>> 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.)

2
jpmc26

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"
2
MaNKuR

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.

1
whackamadoodle3000
# 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 '''
0
Michael Swartz