这是我的功能(如果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
。
解决方案?主要是想知道什么是错的。
答案 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
注意:
sort
和sorted
对字符串和列表都有效。无需先转换为列表。
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
答案 1 :(得分:1)
问题在于:wordlist.sort()
将返回None
,因为它排序到位将None
与None
进行比较始终评估为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
除此之外,还有其他注意事项,首先,无需为True
和False
设置明确的名称;回来吧:
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的答案;他只返回比较排序对象的结果。如果您的比较将为您产生正确的价值,则无需明确。 : - )