2012-02-26 14 views
21

Python文字列のアイテム割り当てを使用する最良の方法は何ですか?Python文字列アイテム代入の代わりに

すなわちs = "ABCDEFGH"s[1] = 'a's[-1]='b'

通常の方法がスローされます。'str' object does not support item assignment

答えて

24

文字列は不変です。つまり、あなたはそれらに全く割り当てることはできません。 (私を思い出させてくれてありがとうOdomontois)

>>> s = 'abc' + 'd' + 'efg' 
>>> s 
'abcdefg' 

または交換:

>>> s = 'abc0efg' 
>>> s.replace('0', 'd') 
'abcdefg' 

をしかし、これらのメソッドのすべてがを作成することを心に留めておく

>>> s = 'abc{0}efg'.format('d') 
>>> s 
'abcdefg' 

または連結:あなたはフォーマッティングを使用することができます文字列のをインプレースで変更するのではなくコピーします。インプレースの変更が必要な場合は、bytearrayを使用できますが、これはalexisが指摘するようにプレーンなASCII文字列でのみ機能します。

>>> b = bytearray('abc0efg') 
>>> b[3] = 'd' 
>>> b 
bytearray(b'abcdefg') 

また、文字のリストを作成して操作することもできます。

>>> l = list('abc0efg') 
>>> l[3] = 'd' 
>>> l 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> ''.join(l) 
'abcdefg' 

そして、もっと複雑な操作のためのreモジュールを考慮してください。これはおそらく頻繁に、大規模な文字列操作を行うための最も効率的かつ正確な方法です。

文字列の書式設定とリスト操作は、少数の挿入のみが必要な場合は、正確で効率的なIMO文字列書式設定であり、頻繁に文字列を更新する必要がある場合はリスト操作です。

+1

str.replace()とre.RegexObject.subメソッドも便利です。 – Odomontois

+0

bytearrayは私によく見えますが、文字列をバイト配列に変換するにはどうしてですか? – w00d

+0

@iKid、上記のコードでは、 '' abc0efg''は文字列であり、 'bytearray( 'abc0efg')'はその文字列をbytearrayに変換します。だからはい: – senderle

5

文字列は「不変」なので、変更されたバージョンの文字列を作成してそれを古い値に割り当てることで、編集の効果が得られます。あなたが交換または文字列内の特定の位置に挿入したい場合は、ほとんどの配列に似た構文は、スライスを使用することです:

s = "ABCDEFGH" 
s = s[:3] + 'd' + s[4:] # Change D to d at position 3 

あなたが別で、特定の文字または文字列を置換することがより可能性があります。

import re 
s = "ABCDEFGH" 
s = re.sub("DE", "--", s) 
+0

Pythonのn00bとして、これはまさに私が特定の位置で文字を変更したかったものでした。ありがとう。 –

0

私は、このオブジェクトは助けることができると思います:たとえば

class Charray(list): 

    def __init__(self, mapping=[]): 
     "A character array." 
     if type(mapping) in [int, float, long]: 
      mapping = str(mapping) 
     list.__init__(self, mapping) 

    def __getslice__(self,i,j): 
     return Charray(list.__getslice__(self,i,j)) 

    def __setitem__(self,i,x): 
     if type(x) <> str or len(x) > 1: 
      raise TypeError 
     else: 
      list.__setitem__(self,i,x) 

    def __repr__(self): 
     return "charray['%s']" % self 

    def __str__(self): 
     return "".join(self) 

を:

>>> carray = Charray("Stack Overflow") 
>>> carray 
charray['Stack Overflow'] 
>>> carray[:5] 
charray['Stack'] 
>>> carray[-8:] 
charray['Overflow'] 
>>> str(carray) 
'Stack Overflow' 
>>> carray[6] = 'z' 
>>> carray 
charray['Stack zverflow'] 
0
s = "ABCDEFGH" s[1] = 'a' s[-1]='b' 

再度結果を集めるのではなく場所に変更し、reでそれを行いますこのように使うことができます

s=s[0:1]+'a'+s[2:] 

これは他の複雑な方法よりも非常に簡単です

関連する問題