[英]Compare two sets of strings and then return whole strings that are different in Python 3.4
我正在編寫一個小的API偵聽程序,並且試圖弄清楚何時發布了一些新的東西。 我已經弄清楚了大部分內容,但是最后一步遇到了問題-我想在其中打印出一些新內容。 我可以將兩個項目列表作為集合進行比較,並獲得正確答案中的字母集合,但是我似乎無法獲得要打印的實際字符串。
這是我編寫的用來比較兩個列表的代碼( new_revised_stuff
和old_revised_stuff
都是字符串列表,例如"Bob likes to eat breakfast at http://bobsburgers.com"
,每個列表有幾十個項目)。
new_stuff = set(new_revised_stuff) - set(old_revised_stuff).intersection(new_revised_stuff)
哪個返回:
set('b','o','l'...)
我可以通過寫來擺脫“設置”符號:
list(new_stuff)
但這並沒有真正的幫助。 如果這是新行,我真的希望它打印出“鮑勃喜歡...”。
我也嘗試過:
new_stuff = []
for a in new_revised_stuff:
for b in old_revised_stuff:
if a != b:
''.join(a)
new_stuff.append(a)
這會導致實際的堆棧溢出,因此顯然是錯誤的代碼。
如果要將單字符的任何可迭代字符連接到字符串中,請使用''.join(new_stuff)
。 例如:
>>> new_stuff = ['b','o','l']
>>> ''.join(new_stuff)
'bol'
但是,這里存在兩個設計固有的問題:
"Hello, Bob"
,則差異集中將只有一個o
和一個l
。 "Bob likes"
,則將其轉換為集合然后再返回字符串將為您提供類似於'k iboeBls'
。 如果這兩個問題中有一個(我懷疑是這樣),您都需要重新考慮算法。 您可以使用OrderedSet
(在collections
文檔中有一個配方)來解決第二個問題,但是第一個問題會更多。
那么,你怎么能做到這一點?
好吧,您實際上並不需要new_revised_stuff
作為集合。 如果您遍歷字符並僅保留不存在於old_revised_stuff
中的old_revised_stuff
,只要old_revised_stuff
是一個集合,則這與將兩個集合相交一樣有效。
但是將old_revised_stuff
設置old_revised_stuff
一個集合也將消除那里的任何重復項,我認為您不希望這樣做。 您真正想要的是一個“多集”。 在Python中,最好的表示方法通常是Counter
。
因此,我認為您想要的(也許)是這樣的:
old_string = ' to eat breakfast at http://bobsburgers.com'
new_string = 'Bob likes to eat breakfast at http://bobsburgers.com'
old_chars = collections.Counter(old_string)
new_chars = []
for ch in new_string:
if old_chars[ch]:
old_chars[ch] -= 1
else:
new_chars.append(ch)
new_string = ''.join(new_chars)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.