簡體   English   中英

更改字符串中的一個字符

[英]Changing one character in a string

Python中替換字符串中字符的最簡單方法是什么?

例如:

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

不要修改字符串。

與他們一起工作; 僅在需要時將它們轉換為字符串。

>>> 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 字符串是不可變的(即它們不能被修改)。 這有很多原因。 使用列表直到您別無選擇,然后才將它們轉換為字符串。

最快的方法?

有三種方式。 對於尋求速度的人,我推薦“方法 2”

方法一

由這個答案給出

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

方法三:

字節數組:

timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
new = text[:1] + 'Z' + text[2:]

Python 字符串是不可變的,您可以通過復制來更改它們。
做你想做的最簡單的方法可能是:

text = "Z" + text[1:]

text[1:]返回text從位置 1 到結尾的字符串,位置從 0 開始計數,因此 '1' 是第二個字符。

編輯:您可以對字符串的任何部分使用相同的字符串切片技術

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

或者,如果字母只出現一次,您可以使用下面建議的搜索和替換技術

從 python 2.6 和 python 3 開始,您可以使用可變的字節數組(與字符串不同,可以按元素進行更改):

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

編輯:將 str 更改為 s

edit2:正如評論中提到的兩位煉金術士,此代碼不適用於 unicode。

就像其他人所說的那樣,通常 Python 字符串應該是不可變的。

但是,如果您使用 CPython(python.org 上的實現),則可以使用 ctypes 來修改內存中的字符串結構。

這是我使用該技術清除字符串的示例。

在python中將數據標記為敏感

為了完整起見,我提到了這一點,這應該是您的最后手段,因為它是駭人聽聞的。

這段代碼不是我的。 我不記得網站表格在哪里,我拿了它。 有趣的是,您可以使用它用一個或多個字符替換一個或多個字符。 雖然這個回復很晚,但像我這樣的新手(任何時候)可能會覺得它很有用。

更改文本功能。

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

字符串在 Python 中是不可變的,這意味着您不能更改現有字符串。 但是如果你想改變其中的任何字符,你可以創建一個新的字符串,如下所示,

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

替換('國王',1,'o')
// 結果:孔

注意:如果你給的位置值大於字符串的長度,它會在末尾追加字符。

替換('狗',10,'s')
// 結果:狗

實際上,使用字符串,您可以執行以下操作:

oldStr = 'Hello World!'    
newStr = ''

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

'HELLO WORLD!'

基本上,我將“添加”+“字符串”組合成一個新字符串:)。

我喜歡 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
>>>

如果你的世界是 100% ascii/utf-8 (很多用例都適合那個盒子):

b = bytearray(s, 'utf-8')
# process - e.g., lowercasing: 
#    b[0] = b[i+1] - 32
s = str(b, 'utf-8')

蟒蛇 3.7.3

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

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

與將字符串轉換為列表並替換第 i 個值然后再次加入相比,它有多快?。

列表方法

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

在單行 if 語句中結合查找替換方法的解決方案可能是:

```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
```

替換字符串<\/strong>中的字符<\/strong>

您可以使用以下任何一種方法:

方法一<\/strong>

一般來說,

string = f'{string[:index]}{replacing_character}{string[index+1:]}'

嘗試這個 :

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

new_string = "".join(string_list)

print(new_string)

一種非常簡單的方法是:

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

輸出:

 Hello World!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM