2012-02-26 66 views
21

什麼是最佳/正確的方式來使用項目分配的Python字符串?替代python字符串項目分配

s = "ABCDEFGH"s[1] = 'a's[-1]='b'

正常的方式將拋出:'str' object does not support item assignment

回答

24

字符串是不可改變的。這意味着你根本無法分配給他們。您可以使用格式:

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

或串聯:

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

或更換(感謝Odomontois提醒我):

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

但是請記住,所有這些方法創建複製該字符串的,而不是就地修改它。如果你想進行就地修改,你可以使用bytearray--儘管這隻適用於普通的ascii字符串,正如alexis指出的那樣。

>>> 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 2012-02-26 14:31:46

+0

bytearray看起來不錯,反正有字符串轉換爲字節數組嗎? – w00d 2012-02-26 14:32:27

+0

@iKid,在上面的代碼中,''abc0efg''是一個字符串,'bytearray('abc0efg')'將該字符串轉換爲一個字節數組。所以是的:) – senderle 2012-02-26 14:36:20

5

由於字符串是「不可變的」,通過構建字符串的修改版本並將其賦值給舊值,可以獲得編輯的效果。如果要替換或插入到字符串中的特定位置,最類似數組的語法是使用切片:

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

它更可能要替換另一個特定的字符或字符串。做到這一點與re,再次收集的結果,而不是就地修改:

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

作爲一個python n00b,這正是我想改變一個角色在某個特定位置的原因。謝謝。 – 2013-03-06 03:53:09

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' 

你可以這樣使用

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

這是比其他複雜的方式非常簡單