web-dev-qa-db-ja.com

Pythonで文字列の文字のすべてのインスタンスを削除するにはどうすればよいですか?

この文字列の文字のすべてのインスタンスを削除するにはどうすればよいですか?ここに私のコードがあります:

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

ただし、これを実行すると、次のようになります。

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

どうしてこれなの?

57
user3367523

Pythonでは文字列は不変です。つまり、文字列が作成されると、文字列の内容を変更することはできません。まったく変更する必要がある場合は、変更を加えた文字列の新しいインスタンスが作成されます。

それを念頭に置いて、これを解決するための非常に多くの方法があります

  1. str.replace を使用して、

    >>> "it is icy".replace("i", "")
    't s cy'
    
  2. str.translate を使用して、

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  3. 正規表現を使用して、

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  4. 理解をフィルターとして使用して、

    >>> "".join([char for char in "it is icy" if char != "i"])
    't s cy'
    
  5. filter 関数を使用する

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

タイミング比較

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

結果

1.64474582672
0.29278588295
0.311302900314

str.replaceおよびstr.translateメソッドは、受け入れられた回答よりも8倍および5倍高速です。

注:理解方法とフィルター方法は遅くなると予想されます、この場合リストを作成し、文字列を作成するために再度トラバースする必要があります。また、reは、1文字の置換には少し過剰です。したがって、それらはすべてタイミング比較から除外されます。

112
thefourtheye

str.replace()を試してください:

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

あなたのコードは最初のインスタンスのみを置き換えるので、私はそれがあなたが望むものであると仮定しました。それらをすべて置き換える場合は、1引数を省略します。

文字列自体の文字を置き換えることはできないため、変数に再割り当てする必要があります。 (本質的に、文字列を変更する代わりに参照を更新する必要があります。)

2
jpmc26

replace()メソッドはこれに対して機能します。文字列から文字を削除するのに役立つコードは次のとおりです。まあ言ってみれば

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

分割することをお勧めします(他の答えが無効であると言っているのではなく、これは別の方法です):

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

文字で分割すると、すべての文字が削除され、リストに変換されます。次に、結合関数を使用してリストを結合します。以下のipythonコンソールテストを見ることができます

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

そしてスピード...

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

置換または翻訳ほど高速ではありませんが、大丈夫です。

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