什麼是最佳/正確的方式來使用項目分配的Python字符串?替代python字符串項目分配
即s = "ABCDEFGH"
s[1] = 'a'
s[-1]='b'
?
正常的方式將拋出:'str' object does not support item assignment
什麼是最佳/正確的方式來使用項目分配的Python字符串?替代python字符串項目分配
即s = "ABCDEFGH"
s[1] = 'a'
s[-1]='b'
?
正常的方式將拋出:'str' object does not support item assignment
字符串是不可改變的。這意味着你根本無法分配給他們。您可以使用格式:
>>> 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只需要少量插入時的字符串格式化,以及當您需要頻繁更新字符串時進行列表操作。
由於字符串是「不可變的」,通過構建字符串的修改版本並將其賦值給舊值,可以獲得編輯的效果。如果要替換或插入到字符串中的特定位置,最類似數組的語法是使用切片:
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)
作爲一個python n00b,這正是我想改變一個角色在某個特定位置的原因。謝謝。 – 2013-03-06 03:53:09
我想這個對象可以幫助:
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']
s = "ABCDEFGH" s[1] = 'a' s[-1]='b'
你可以這樣使用
s=s[0:1]+'a'+s[2:]
這是比其他複雜的方式非常簡單
此外str.replace()和re.RegexObject.sub方法可能會有用。 – Odomontois 2012-02-26 14:31:46
bytearray看起來不錯,反正有字符串轉換爲字節數組嗎? – w00d 2012-02-26 14:32:27
@iKid,在上面的代碼中,''abc0efg''是一個字符串,'bytearray('abc0efg')'將該字符串轉換爲一個字節數組。所以是的:) – senderle 2012-02-26 14:36:20