什么是最佳/正确的方式来使用项目分配的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