簡體   English   中英

如何替換python中的多個字符串?

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

dict.get上的一個很好的參考。


在這種情況下,不僅基於映射的解決方案更有效(請參閱 @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'] 要更換所有項目替換sentencenewsentence第一替換行之后。

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.

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