2012-02-26 64 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:] 

这是比其他复杂的方式非常简单