我想從第一個字串 s1 中完全洗掉它們在另一個字串 s2 中出現的次數的所有字符,即如果 s1 = "AAABBBCCCCCCD" 和 s2 = "ABBCCC" 那么結果應該是 s = "AABCCCD"。(結果字串中字符的順序實際上無關緊要,但如果可以保留它是一個加號。)
以下相當粗糙的代碼可以做到這一點:
def reduce_string(s1, s2):
s = s1
for c in s2:
if c in s:
s = s.replace(c, "", 1)
return(s)
# examples
reduce_string("AAABBBCCCCCCD", "ABBCCC")
reduce_string("AAABBBCCCCCCD", "ABBCCCE")
我的問題是,是否可以通過巧妙地使用某些內置函式或至少以更優雅的方式來實作?感謝您的所有回答!
uj5u.com熱心網友回復:
您可以使用計數器物件。將一個與另一個相減并將其余元素連接在一起。
from collections import Counter
s1 = "AAABBBCCCCCCD"
s2 = "ABBCCC"
counter = Counter(s1)
counter.subtract(Counter(s2))
result = ''.join(counter.elements())
print(result)
AABCCCD
作為單線:
print(''.join((Counter(s1) - Counter(s2)).elements()))
uj5u.com熱心網友回復:
您應該看到模塊中有一個filterfalse函式itertools。請參閱此處的檔案。
filterfalse當謂詞被評估為 時,該函式從可迭代物件回傳元素False。
因此,一種可能的解決方案可能是:
import itertools
def reduce_string(s1, s2):
def predicate(letter, param=list(s2)):
if letter in param:
param.remove(letter)
return True
return False
result = itertools.filterfalse(predicate, s1)
return ''.join(result)
reduce_string("AAABBBCCCCCCD", "ABBCCC")
reduce_string("AAABBBCCCCCCD", "ABBCCCE")
但是,請注意我的predicate函式在更改第二個字串時有點棘手。
param當函式作為物件predicate在reduce_string作用域內創建時,會評估關鍵字引數list。
由于參考沒有改變,但里面的元素沒有改變param,出于比較的原因,我能夠改變第二個字串。
現在,問題仍然存在:有沒有更優雅的方式來定義predicate函式?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370927.html
上一篇:為從具有動態長度的字串陣列映射的React組件設定鍵
下一篇:c#回傳字串串列和泛型串列
