簡體   English   中英

比較兩組字符串,然后返回在Python 3.4中不同的整個字符串

[英]Compare two sets of strings and then return whole strings that are different in Python 3.4

我正在編寫一個小的API偵聽程序,並且試圖弄清楚何時發布了一些新的東西。 我已經弄清楚了大部分內容,但是最后一步遇到了問題-我想在其中打印出一些新內容。 我可以將兩個項目列表作為集合進行比較,並獲得正確答案中的字母集合,但是我似乎無法獲得要打印的實際字符串。

這是我編寫的用來比較兩個列表的代碼( new_revised_stuffold_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.

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