Answers:
不要修改字符串。
与他们一起工作;仅在需要时才将它们转换为字符串。
>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'
Python字符串是不可变的(即无法修改)。有很多的原因。除非您别无选择,否则请使用列表,然后将它们变成字符串。
MID
切片那样的东西:s[:index] + c + s[index+1:]
有三种方法。对于速度寻求者,我建议使用“方法2”
方法1
由这个答案给出
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
与“方法2”相比,这相当慢
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
方法2(快速方法)
由这个答案给出
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
哪个更快:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
方法3:
字节数组:
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
速度是最快的方法的两倍。
从python 2.6和python 3开始,您可以使用可变的字节数组(可以与字符串不同,可以逐个元素地更改):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
编辑:更改为s
edit2:正如两位炼金术士在评论中所述,此代码不适用于unicode。
bytearray(s)
,而不是bytearray(str)
。对于另一个,这将产生:TypeError: string argument without an encoding
。如果指定编码,则得到TypeError: an integer is required
。这就是Python 3或Python 2的unicode。如果您在Python 2中执行此操作(第二行已更正),它将不适用于非ASCII字符,因为它们可能不仅仅是一个字节。试试看s = 'Héllo'
,你会得到'He\xa9llo'
。
s = u'abcdefg'
。
就像其他人所说的那样,通常Python字符串应该是不可变的。
但是,如果您使用的是CPython,即python.org的实现,则可以使用ctypes修改内存中的字符串结构。
这是我使用该技术清除字符串的示例。
为了完整起见,我提到了这一点,这应该是您的最后选择,因为它有点黑。
str
bytearray
str
此代码不是我的。我不记得我在哪里填写网站表格。有趣的是,您可以使用此字符用一个或多个字符替换一个或多个字符。尽管此回复很晚,但像我这样的新手(随时)可能会觉得有用。
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
。mytext = mytext.replace('l', 'W')
->HeWWo Zorld
如果您的世界是100%ascii/utf-8
(很多用例都放在该框中):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
python 3.7.3
我想添加另一种更改字符串中字符的方式。
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
与将字符串转换为list并替换ith值然后再次加入相比,速度有多快?
清单方式
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
我的解决方案
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526