[英]How to replace multiple strings in python?
我正在嘗試替換列表中的多個字符串,但我沒有達到。 我要替換的字符串是。 數字代表單詞的正確順序
sentence = ['1', '2', '3', '4']
我想用文本 'i', 'put', 'this', 'here' 替換數字,使其如下所示
['i', 'put', 'this', 'here']
我發現一行代碼只能替換一個單詞。
newsentence = [n.replace('1', 'I') for n in sentence]
我試圖重復代碼 4 次,以便它替換所有數字。
newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in sentence]
newsentence = [n.replace('3', 'this') for n in sentence]
newsentence = [n.replace('4', 'here') for n in sentence]
但結果是執行了最后一次替換,導致
['1', '2', '3', 'here']
感謝您的任何反饋
請參閱@KeyurPotdar 的答案,以解釋您的原始解決方案為何不起作用。
對於您的問題的基於列表理解的解決方案(這似乎是您所追求的),您可以創建輸入到輸出的映射,然后使用您的輸入迭代映射
mapping = {
'1': 'i',
'2': 'put',
'3': 'this',
'4': 'here',
}
sentence = ['1', '2', '3', '4']
newsentence = [mapping[word] for word in sentence]
# ['I', 'put', 'this', 'here']
這很好,但是如果您決定在尚未定義輸出的mapping
拋出更多輸入,則會得到KeyError
。 為了輕松處理這個問題,您可以使用dict.get
,它允許您提供一個回退值,如果給定的鍵丟失,則返回。
newsentence = [mapping.get(word, word) for word in sentence]
# ['I', 'put', 'this', 'here']
在這種情況下,不僅基於映射的解決方案更有效(請參閱 @KeyurPotdar 對此的注釋),而且將代碼分離為數據和邏輯是正確的事情™。
如果您可以將基於代碼/邏輯的問題(例如原始問題中的列表推導式序列)轉換為基於映射的問題,您幾乎總能在可維護性和代碼清晰度方面獲勝。 觀察這個解決方案的數據和邏輯是混合的:
newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in newsentence]
newsentence = [n.replace('3', 'this') for n in newsentence]
newsentence = [n.replace('4', 'here') for n in newsentence]
但是,在基於映射的解決方案中,它們是分開的
# DATA
mapping = {
'1': 'i',
'2': 'put',
'3': 'this',
'4': 'here',
}
# LOGIC
newsentence = [mapping.get(word, word) for word in sentence]
這給你買什么? 假設您最終不得不支持映射 1000 個單詞,並且這些單詞經常更改。 將單詞與邏輯混合在一起會使它們更難找到,並且如果更改只會影響數據或還可能意外更改控制流,則更難在精神上解耦。 對於基於映射的解決方案,肯定的是更改只會影響數據。
考慮到我們需要添加'1a'
到'we'
的映射。 在混合邏輯/數據示例中,很容易錯過將sentence
更改為newsentence
:
newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('1a', 'we') for n in sentence]
newsentence = [n.replace('2', 'put') for n in newsentence]
newsentence = [n.replace('3', 'this') for n in newsentence]
newsentence = [n.replace('4', 'here') for n in newsentence]
哎呀! 在基於映射的示例中,這種類型的錯誤在設計上是不可能的。
此外,通過將數據與邏輯解耦,可以開始將數據存儲在單獨的文件(例如 JSON 或 YAML)中。 這使得版本控制更簡單一些。 然后它開啟了擁有用戶可自定義映射的可能性,您不必將這些映射硬編碼到腳本中。 解耦==好。
看起來您知道需要替換哪些單詞。 使用以下方法將在O(n)
時間內做到這一點。
changes = {
'1': 'i',
'2': 'put',
'3': 'this',
'4': 'here'
}
sentence = ['1', '2', '3', '4']
newsentence = []
for word in sentence:
try:
newsentence.append(changes[word])
except KeyError:
newsentence.append(word)
print(newsentence)
# ['i', 'put', 'this', 'here']
說明:
您在這里要做的是檢查列表項是否在字典中可用。 如果可用,則使用它的值並將該值附加到新列表中。 否則,直接追加舊列表的值。
代碼changes[word]
在該行newsentence.append(changes[word])
將引發KeyError
,如果關鍵是不是在字典可用。 這就是為什么我們要捕獲該錯誤並直接附加單詞的原因。
另請注意,此代碼使用EAFP 原理。
注意:下面的代碼只是為了告訴你哪里出錯了。 避免使用它(原因如下所述)。
為了幫助您了解代碼中發生的事情,請查看以下代碼段:
>>> sentence = ['1', '2', '3', '4']
>>> newsentence = [n.replace('1', 'I') for n in sentence]
>>> newsentence
['I', '2', '3', '4']
>>> newsentence = [n.replace('2', 'put') for n in sentence]
>>> newsentence
['1', 'put', '3', '4']
>>> newsentence = [n.replace('3', 'this') for n in sentence]
>>> newsentence
['1', '2', 'this', '4']
...
簡而言之,您每次都替換原始句子中的單個項目,即['1', '2', '3', '4']
。 要更換所有項目替換sentence
與newsentence
第一替換行之后。
sentence = ['1', '2', '3', '4']
newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in newsentence]
newsentence = [n.replace('3', 'this') for n in newsentence]
newsentence = [n.replace('4', 'here') for n in newsentence]
print(newsentence)
# ['I', 'put', 'this', 'here']
但是,避免使用此代碼,因為成本是二次的; 或者更准確地說,它是O(m*n)
,其中m
是列表的大小, n
是要替換的單詞數; 顯然,如果列表更大,寫這個是不可行的。
你可以這樣做:
newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in newsentence]
newsentence = [n.replace('3', 'this') for n in newsentence]
newsentence = [n.replace('4', 'here') for n in newsentence]
這意味着每次都會更改前一個,而不是恢復到原始狀態,然后只進行一次替換。 您還可以使用format()
:
sentence='{1}{2}{3}{4}{5}'
sentence.format('I', 'put', 'this', 'here')
有關format()
函數的更多信息,請參閱此頁面。
有一種翻譯方法,您可以通過該方法進行多次替換
s = '1 2 3 4'
replaced_string = s.translate(str.maketrans({'1': 'I', '2': 'put', '3': 'this', '4': 'here'}))
print(replaced_string)
#output: I put this here
您可以通過這種方式避免嵌套的替換語句干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.