字谜代码返回错误答案

时间:2018-07-06 21:59:46

标签: python anagram

我写了一个简单的程序来测试两个单词是否是字谜(可以重新排列成另一个单词)。最初,当我测试非常不同的单词(例如“ 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()

1 个答案:

答案 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,而无需检查其余字母。因此,juliojulis匹配,因为jjulis中。实际上,jordanjulis也匹配,因为jjulis中。

这里正确的逻辑是,只有在您检查了所有 后,其中所有没有失败的情况下,这些单词才是字谜。由于您将在第一次失败时进入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):

但这仍然不正确。如果您尝试将appleaplee进行比较该怎么办?它们的长度相同,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