更改字符串中的一个字符?

时间:2009-08-04 15:48:39

标签: python

Python中最简单的方法是替换字符串中的字符,如:

text = "abcdefg";
text[1] = "Z";
           ^

15 个答案:

答案 0 :(得分:439)

不要修改字符串。

以列表的形式与他们合作;只在需要时才将它们变成字符串。

>>> 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字符串是不可变的(即它们不能被修改)。这有a lot个原因。使用列表直到你别无选择,只有把它们变成字符串。

答案 1 :(得分:152)

最快的方法?

有三种方法。对于速度寻求者,我推荐'方法2'

方法1

由此answer

给出
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(快速方法)

由此answer

给出
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

答案 2 :(得分:121)

new = text[:1] + 'Z' + text[2:]

答案 3 :(得分:30)

Python字符串是不可变的,您可以通过复制来更改它们 做你想做的最简单的方法可能是。

text = "Z" + text[1:]

文本[1:]将文本中的字符串从位置1返回到结尾,位置计数从0开始,因此“1”是第二个字符。

编辑: 您可以对字符串的任何部分使用相同的字符串切片技术

text = text[:1] + "Z" + text[2:]

或者,如果只出现一次字母,您可以使用建议的搜索和替换技术 以下

答案 4 :(得分:12)

从python 2.6和python 3开始,你可以使用可变的bytearrays(可以像字符串一样改变字符串):

s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg

编辑:将str更改为s

edit2:作为评论中提到的两位炼金术士,此代码不适用于unicode。

答案 5 :(得分:4)

正如其他人所说,通常Python字符串应该是不可变的。

但是,如果您正在使用CPython(python.org上的实现),则可以使用ctypes修改内存中的字符串结构。

以下是我使用该技术清除字符串的示例。

Mark data as sensitive in python

我为了完整起见而提到这一点,这应该是你的最后手段,因为它是黑客。

答案 6 :(得分:3)

字符串在Python中是不可变的,这意味着您无法更改现有字符串。 但是,如果要更改其中的任何字符,可以按如下所示创建一个新字符串,

def replace(s, position, character):
    return s[:position] + character + s[position+1:]

replace('King',1,'o')
//结果:孔

注意:如果位置值大于字符串的长度,它将在末尾附加字符。

replace('Dog',10,'s')
//结果:狗

答案 7 :(得分:1)

实际上,对于字符串,你可以这样做:

oldStr = 'Hello World!'    
newStr = ''

for i in oldStr:  
    if 'a' < i < 'z':    
        newStr += chr(ord(i)-32)     
    else:      
        newStr += i
print(newStr)

'HELLO WORLD!'

基本上,我是&#34;添加&#34; +&#34;字符串&#34;一起换成新的字符串:)。

答案 8 :(得分:1)

我喜欢 f 字符串:

text = f'{text[:1]}Z{text[2:]}'

在我的机器上,这种方法比使用 + 连接字符串的“快速方法”快 10%:

>>> timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
1.1691178000000093
>>> timeit.timeit("text = 'abcdefg'; text = f'{text[:1]}Z{text[2:]}'", number =1000000)
0.9047831999999971
>>>

答案 9 :(得分:0)

这段代码不是我的。我记不起网站的形式,我把它拿走了。有趣的是,您可以使用它来用一个或多个charectors替换一个或多个字符。 虽然这个回复很晚,但像我这样的新手(随时)可能会觉得它很有用。

更改文字功能。

mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,

答案 10 :(得分:0)

如果您的世界是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

答案 11 :(得分:0)

我想添加另一种更改字符串中字符的方法。

>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'

与将字符串转换为列表并替换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

答案 12 :(得分:0)

如果声明可能是,则将 find replace 方法合并在一行中的解决方案:

```python
my_var = "stackoverflaw"
my_new_var = my_var.replace('a', 'o', 1) if my_var.find('s') != -1 else my_var
print(f"my_var = {my_var}")           # my_var = stackoverflaw
print(f"my_new_var = {my_new_var}")   # my_new_var = stackoverflow
```

答案 13 :(得分:-2)

试试这个:

old_string = "mba"
string_list = list(old_string)
string_list[2] = "e"
//Replace 3rd element

new_string = "".join(string_list)

print(new_string)

答案 14 :(得分:-3)

一种非常简单的方法是:

word = "Heloo World!"
word = word.replace(word[3], "l", 1)
print word

输出:

 Hello World!