it-swarm.com.de

Wie lösche ich alle Instanzen eines Zeichens in einem String in Python?

Wie lösche ich alle Instanzen eines Zeichens in dieser Zeichenfolge? Hier ist mein Code:

def findreplace(char, string):
    place = string.index(char)
    string[place] = ''
    return string

Wenn ich dies jedoch ausführe, passiert Folgendes:

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

Warum ist das?

57
user3367523

Strings sind in Python unveränderlich. Das bedeutet, dass Sie nach dem Erstellen eines Strings den Inhalt der Strings nicht mehr ändern können. Wenn Sie es überhaupt ändern müssen, wird eine neue Instanz der Zeichenfolge mit den Änderungen erstellt.

Vor diesem Hintergrund haben wir so viele Möglichkeiten, dies zu lösen

  1. Mit str.replace ,

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

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  3. Unter Verwendung des regulären Ausdrucks

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  4. Verständnis als Filter nutzen,

    >>> "".join([char for char in "it is icy" if char != "i"])
    't s cy'
    
  5. Mit der Funktion filter

    >>> "".join(filter(lambda char: char != "i", "it is icy"))
    't s cy'
    

Timing-Vergleich

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")

Ergebnis

1.64474582672
0.29278588295
0.311302900314

str.replace und str.translate Methoden sind 8 und 5 mal schneller als die akzeptierte Antwort.

Hinweis: Die Erfassungsmethode und die Filtermethode werden voraussichtlich langsamer sein, in diesem Fall, da sie eine Liste erstellen müssen und dann müssen sie erneut durchlaufen werden, um eine Zeichenfolge zu konstruieren. Und re ist ein bisschen übertrieben für das Ersetzen eines einzelnen Zeichens. Sie sind also alle vom Timing-Vergleich ausgeschlossen.

112
thefourtheye

Versuchen Sie str.replace():

str="it is icy"
print str.replace("i", "")
3
Blue Ice
>>> x = 'it is icy'.replace('i', '', 1)
>>> x
't is icy'

Da Ihr Code nur die erste Instanz ersetzen würde, bin ich davon ausgegangen, dass Sie das wollten. Wenn Sie alle ersetzen möchten, lassen Sie das 1 Streit.

Da Sie das Zeichen in der Zeichenfolge selbst nicht ersetzen können, müssen Sie es der Variablen erneut zuweisen. (Im Wesentlichen müssen Sie die Referenz aktualisieren, anstatt die Zeichenfolge zu ändern.)

2
jpmc26

Die Methode replace() funktioniert hierfür. Hier ist der Code, mit dem Zeichen aus der Zeichenfolge entfernt werden können. sagen wir

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

Ich schlage Split vor (ohne zu sagen, dass die anderen Antworten ungültig sind, dies ist nur eine andere Möglichkeit, dies zu tun):

def findreplace(char, string):
   return ''.join(string.split(char))

Durch das Teilen durch ein Zeichen werden alle Zeichen entfernt und in eine Liste umgewandelt. Dann verbinden wir die Liste mit der Join-Funktion. Sie können den Ipython-Konsolentest unten sehen

In[112]: findreplace('i', 'it is icy')
Out[112]: 't s cy'

Und die Geschwindigkeit ...

In[114]: timeit("findreplace('it is icy','i')", "from __main__ import findreplace")
Out[114]: 0.9927914671134204

Nicht so schnell wie ersetzen oder übersetzen, aber ok.

1
# 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