簡體   English   中英

無法弄清楚為什么我的函數返回帶有字謎的True

[英]Can't figure out well why my function is returning True with anagrams

這是我的功能(說兩個比較單詞是否是字謎):

def are_anagrams(word1, word2):
    word1list = list(word1)
    word2list = list(word2)
    anagramfalse = False
    anagramtrue = True
    if (word1 == word2):
        return anagramfalse
    if (word1list.sort()) == (word2list.sort()):
        return anagramtrue
    else:
        return anagramfalse

所以這個功能正在返回

are_anagrams("lopped", "poodle")

由於某種原因,它為True 不知道為什么。 應該比較每個單詞的字母排序列表並返回False

解? 主要只是想知道怎么了。

sort不符合您的想法。 觀察:

>>> x = list('lopped')
>>> print(x.sort())
None

由於None == None始終為True,因此該函數始終返回True。

此外,可以簡化代碼:

def are_anagrams(word1, word2):
    return sorted(word1) == sorted(word2)

樣品運行:

>>> are_anagrams("lopped", "poodle")
False
>>> are_anagrams("lopped", "doppel")
True

筆記:

  1. sortsorted對字符串和列表sorted操作。 無需先轉換為列表。

  2. sorted(word1) == sorted(word2)計算結果為True或False。 因此,可以消除if-then-else語句。

短語和大小寫混合的擴展

短語也可以視為彼此的字謎。 同樣,對於字謎,通常應忽略大小寫。 從而:

def are_anagrams(word1, word2):
    return sorted(word1.lower().replace(' ', '')) == sorted(word2.lower().replace(' ', ''))

從而:

>>> are_anagrams('Lopped', 'Ed Plop')
True

拒絕單詞相等的情況

如果單詞相同,是否應將它們視為字謎? 如果不是,則使用:

     def are_anagrams(word1, word2):
        return (word1.lower() != word2.lower()) and sorted(word1.lower().replace(' ', '')) == sorted(word2.lower().replace(' ', ''))

例:

>>> are_anagrams('Lopped', 'Lopped')
False
>>> are_anagrams('Lopped', 'Old Pep')
True

這就是問題所在: wordlist.sort()將返回None因為它將進行適當的排序NoneNone進行比較將始終評估為True並產生偽造的結果。 您應該使用sorted() ,而不是返回新排序的列表,然后執行比較:

def are_anagrams(word1, word2):
    word1list = list(word1)
    word2list = list(word2)
    anagramfalse = False
    anagramtrue = True
    if (word1 == word2):
        return anagramfalse
    if (sorted(word1list)) == (sorted(word2list)):
        return anagramtrue
    else:
        return anagramfalse

除此之外,還有其他需要注意的事情,首先,無需為TrueFalse設置顯式名稱; 只需退貨:

def are_anagrams(word1, word2):
    word1list = list(word1)
    word2list = list(word2)
    if (word1 == word2):
        return False
    if (sorted(word1list)) == (sorted(word2list)):
        return True
    else:
        return False

其次,無需將字符串轉換為具有listsorted可以通過從字符串創建list ,對其進行排序然后返回來自動為您處理:

def are_anagrams(word1, word2):
    if (word1 == word2):
        return False
    if (sorted(word1)) == (sorted(word2)):
        return True
    else:
        return False

第三位word1 == word2並不會真正起到提早退出的“快速檢查”的作用。 一般而言,排序速度很快 ,您可以將它們放在一起:

def are_anagrams(word1, word2):
    if (sorted(word1)) == (sorted(word2)):
        return True
    else:
        return False

為了使該代碼盡可能地排序,最后一步,請看Johns的答案。 他只返回比較已排序對象的結果。 如果您的比較能夠為您帶來正確的價值,則無需明確。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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