我写了一个简单的程序来测试两个单词是否是字谜(可以重新排列成另一个单词)。最初,当我测试非常不同的单词(例如“ 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()
答案 0 :(得分:0)
您最大的问题在这里:
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
中。
这里正确的逻辑是,只有在您检查了所有 后,其中所有没有失败的情况下,这些单词才是字谜。由于您将在第一次失败时进入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