替代python字符串项目分配

时间:2012-02-26 14:18:01

标签: python string

为python字符串使用项目分配的最佳/正确方法是什么?

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

正常方式将抛出:'str' object does not support item assignment

4 个答案:

答案 0 :(得分:29)

字符串是不可变的。这意味着你根本无法分配它们。您可以使用格式:

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

或串联:

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

或替换(感谢Odomontois提醒我):

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

但请记住,所有这些方法都会创建字符串的副本,而不是就地修改它。如果你想要就地修改,你可以使用bytearray - 虽然这只适用于普通的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 :(得分:6)

由于字符串是“不可变的”,因此您可以通过构造字符串的修改版本并将其分配给旧值来获得编辑效果。如果要替换或插入字符串中的特定位置,最类似数组的语法是使用切片:

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)

答案 2 :(得分:-1)

我想这个对象可以提供帮助:

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']

答案 3 :(得分:-1)

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

你可以像这样使用

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

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