![](/img/trans.png)
[英]I can't figure out how to write to my data to a csv file as well as having my sorting code function correctly
[英]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
笔记:
sort
和sorted
对字符串和列表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
这就是问题所在: 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的答案。 他只返回比较已排序对象的结果。 如果您的比较能够为您带来正确的价值,则无需明确。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.