无法弄清楚为什么我的函数用anagrams返回True

时间:2016-08-03 07:09:33

标签: python python-3.x

这是我的功能(如果2个比较的单词是否是字谜,则说:)

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

解决方案?主要是想知道什么是错的。

2 个答案:

答案 0 :(得分:1)

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对字符串和列表都有效。无需先转换为列表。

  2. sorted(word1) == sorted(word2)评估为True或False。结果,可以消除if-then-else语句。

  3. 短语和混合大小写

    的扩展

    短语也可以被认为是彼此的字谜。此外,对于字谜,通常应忽略案例。因此:

    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
    

答案 1 :(得分:1)

问题在于: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

第二关,不需要将字符串强制转换为list的列表,sorted会自动通过从字符串创建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的答案;他只返回比较排序对象的结果。如果您的比较将为您产生正确的价值,则无需明确。 : - )