返回错误答案的字谜代码
anagram code returning wrong answers
我写了一个简单的程序来测试两个单词是否是变位词(可以重新排列成另一个单词)。起初它似乎有效,当我测试非常不同的词时,比如 "julio" 和 "cesar"(这些是我的名字)并且它返回 "false",但后来我测试了不同的词只有一个字母,如 "julio" 和 "julis",但它返回 "true"。我想知道我做错了什么。提前致谢。
抱歉,标题不太具体,我不知道如何获得比这更具体的内容
PS: 代码写在python如果有帮助
import time, os
def detector():
os.system('cls')
input_1 = input("Enter the First word: \n")
print("=" * 3 * len(input_1))
input_2 = input("Enter the second word: \n")
print("=" * 3 * len(input_1))
win_index = 0
input_1 = input_1.lower()
input_2 = input_2.lower()
if len(input_1) < len(input_2):
print("This is not a anagram")
return False
else:
print("\nLoading...\n")
time.sleep(1)
for i in range(len(input_1)):
if input_1[letter_index] in input_2:
letter_index += 1
print("This is a anagram")
return True
break
else:
print("This is not a anagram")
return False
detector()
你最大的问题在这里:
if input_1[letter_index] in input_2:
letter_index += 1
print("This is a anagram")
return True
break
一旦在 input_1
中的任何字母在 input_2
中找到,您将打印出 This is an anagram
然后 return True
,而无需检查其余部分这些信。所以,julio
和 julis
匹配,因为 j
在 julis
中。事实上,jordan
和 julis
也匹配,因为 j
在 julis
.
中
这里的正确逻辑是,如果在您检查了 所有 之后,none[=81,那么这些单词只是变位词=] 他们失败了。由于您将在第一次失败时进入 return False
,因此您可以将其移至循环的末尾——唯一可以通过循环的方法就是不 return False
。
此外,letter_index
未在任何地方定义。您可能想使用 i
?
所以,用这个替换你的循环:
for i in range(len(input_1)):
if input_1[i] not in input_2:
print("This is not a anagram")
return False
print("This is an anagram")
return True
... 或者,更好:
for letter in input_1:
if letter not in input_2:
print("This is not a anagram")
return False
print("This is an anagram")
return True
然而,这仍然不对。例如,考虑如果有重复的字母会怎样?
如果您检查 apple
与 aple
,它将通过。毕竟,apple
并不比 aple
短,而且 apple
中的每个字母也在 aple
中。要解决此问题,您需要将 <
检查替换为 !=
检查:
if len(input_1) != len(input_2):
但这还是不对。如果您尝试 apple
与 aplee
会怎样?它们的长度相同,apple
中的每个字母都在 aplee
中,但它们不是变位词。
解决此问题的唯一方法是确保您只使用 input_2
中的每个字母一次。
您可以通过在每次使用时删除一份 letter
来做到这一点:
for letter in input_1:
if letter not in input_2:
print("This is not a anagram")
return False
else:
input_2 = input_2.replace(letter, '', 1)
print("This is an anagram")
return True
现在可以了。但它很笨重。如果你使用更好的数据结构会好很多,比如 Counter
,它专为查找值和递减计数而设计:
from collections import Counter
counts = Counter(input_2)
for letter in input_1:
if not counts[letter]:
print("This is not an anagram")
return False
else:
counts[letter] -= 1
但是一旦你使用了 Counter
,你可以使这个更简单:
counts_1 = Counter(input_1)
counts_2 = Counter(input_2)
if counts_1 == counts_2:
print("This is an anagram")
return True
else:
print("This is not an anagram")
return False
我写了一个简单的程序来测试两个单词是否是变位词(可以重新排列成另一个单词)。起初它似乎有效,当我测试非常不同的词时,比如 "julio" 和 "cesar"(这些是我的名字)并且它返回 "false",但后来我测试了不同的词只有一个字母,如 "julio" 和 "julis",但它返回 "true"。我想知道我做错了什么。提前致谢。 抱歉,标题不太具体,我不知道如何获得比这更具体的内容
PS: 代码写在python如果有帮助
import time, os
def detector():
os.system('cls')
input_1 = input("Enter the First word: \n")
print("=" * 3 * len(input_1))
input_2 = input("Enter the second word: \n")
print("=" * 3 * len(input_1))
win_index = 0
input_1 = input_1.lower()
input_2 = input_2.lower()
if len(input_1) < len(input_2):
print("This is not a anagram")
return False
else:
print("\nLoading...\n")
time.sleep(1)
for i in range(len(input_1)):
if input_1[letter_index] in input_2:
letter_index += 1
print("This is a anagram")
return True
break
else:
print("This is not a anagram")
return False
detector()
你最大的问题在这里:
if input_1[letter_index] in input_2:
letter_index += 1
print("This is a anagram")
return True
break
一旦在 input_1
中的任何字母在 input_2
中找到,您将打印出 This is an anagram
然后 return True
,而无需检查其余部分这些信。所以,julio
和 julis
匹配,因为 j
在 julis
中。事实上,jordan
和 julis
也匹配,因为 j
在 julis
.
这里的正确逻辑是,如果在您检查了 所有 之后,none[=81,那么这些单词只是变位词=] 他们失败了。由于您将在第一次失败时进入 return False
,因此您可以将其移至循环的末尾——唯一可以通过循环的方法就是不 return False
。
此外,letter_index
未在任何地方定义。您可能想使用 i
?
所以,用这个替换你的循环:
for i in range(len(input_1)):
if input_1[i] not in input_2:
print("This is not a anagram")
return False
print("This is an anagram")
return True
... 或者,更好:
for letter in input_1:
if letter not in input_2:
print("This is not a anagram")
return False
print("This is an anagram")
return True
然而,这仍然不对。例如,考虑如果有重复的字母会怎样?
如果您检查 apple
与 aple
,它将通过。毕竟,apple
并不比 aple
短,而且 apple
中的每个字母也在 aple
中。要解决此问题,您需要将 <
检查替换为 !=
检查:
if len(input_1) != len(input_2):
但这还是不对。如果您尝试 apple
与 aplee
会怎样?它们的长度相同,apple
中的每个字母都在 aplee
中,但它们不是变位词。
解决此问题的唯一方法是确保您只使用 input_2
中的每个字母一次。
您可以通过在每次使用时删除一份 letter
来做到这一点:
for letter in input_1:
if letter not in input_2:
print("This is not a anagram")
return False
else:
input_2 = input_2.replace(letter, '', 1)
print("This is an anagram")
return True
现在可以了。但它很笨重。如果你使用更好的数据结构会好很多,比如 Counter
,它专为查找值和递减计数而设计:
from collections import Counter
counts = Counter(input_2)
for letter in input_1:
if not counts[letter]:
print("This is not an anagram")
return False
else:
counts[letter] -= 1
但是一旦你使用了 Counter
,你可以使这个更简单:
counts_1 = Counter(input_1)
counts_2 = Counter(input_2)
if counts_1 == counts_2:
print("This is an anagram")
return True
else:
print("This is not an anagram")
return False