回答:
文字列を変更しないでください。
それらをリストとして使用します。必要な場合にのみ文字列に変換します。
>>> 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'
Python文字列は不変です(つまり、変更できません)。これには多くの理由があります。選択肢がなくなるまでリストを使用します。リストを文字列に変換してください。
MID
スライスによるものなどの必要はありません:s[:index] + c + s[index+1:]
3つの方法があります。スピードを求める人には「方法2」をお勧めします
方法1
この答えによって与えられる
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
「方法2」に比べてかなり遅い
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
方法2(高速方法)
この答えによって与えられる
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
これははるかに高速です:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
方法3:
バイト配列:
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
。最高速の2倍の速度です。
Python文字列は不変です。コピーを作成して変更します。
あなたが望むことをする最も簡単な方法はおそらく:
text = "Z" + text[1:]
text[1:]
リターンの文字列text
末尾に位置1からは、位置が0から「1」のように、カウント番目の文字です。
編集:文字列のどの部分にも同じ文字列スライス手法を使用できます
text = text[:1] + "Z" + text[2:]
または、文字が一度だけ表示される場合は、以下で提案されている検索と置換のテクニックを使用できます
python 2.6とpython 3以降では、変更可能なバイト配列を使用できます(文字列とは異なり、要素ごとに変更できます)。
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
編集:strをsに変更
edit2:Two-Bit Alchemistがコメントで述べたように、このコードはユニコードでは機能しません。
bytearray(s)
はなく、であるべきbytearray(str)
です。別の場合、これは以下を生成しますTypeError: string argument without an encoding
。エンコーディングを指定すると、を取得しTypeError: an integer is required
ます。これは、Python 3またはPython 2のユニコードの場合です。これをPython 2で(2行目を修正して)実行すると、ASCII以外の文字は1バイトではない可能性があるため機能しません。でそれを試してみてs = 'Héllo'
、あなたが取得します'He\xa9llo'
。
s = u'abcdefg'
。
他の人が言ったように、一般にPython文字列は不変であると想定されています。
ただし、python.orgでの実装であるCPythonを使用している場合は、ctypesを使用してメモリ内の文字列構造を変更できます。
これは、文字列をクリアする手法を使用する例です。
完全を期すためにこれについて触れますが、ハックなので、これが最後の手段になるはずです。
str
bytearray
str
このコードは私のものではありません。私はそれを取った場所のフォームを思い出すことができませんでした。興味深いことに、これを使用して、1つ以上の文字を1つ以上の文字に置き換えることができます。この返信は非常に遅いですが、私のような初心者は(いつでも)役に立つと思うかもしれません。
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
。mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
。ドキュメントへのリンク
実際には、文字列を使用すると、次のようなことができます。
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
基本的に、私は一緒に新しい文字列に「追加」+「文字列」しています:)。
文字列の文字を変更する別の方法を追加したいと思います。
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
文字列をリストに変換し、i番目の値を置き換えてから再度結合する場合と比較すると、どれくらい高速ですか。
リストアプローチ
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
私の解決策
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526