Python - 比较2个单词并检查它们是否是字谜

时间:2017-03-20 22:12:14

标签: python-3.x anagram

我正在尝试定义一个带2个字符串的函数,比较这两个字符串,如果它们是anagram则返回True。我不想导入馆藏。

因此,如果string1为python且字符串2为nohtyp,则应返回True。否则,显然,返回false。这是我的代码到目前为止的样子:

def check_anagram(str1, str2):
if len(str1) != len(str2):
    return False
else:
    for i in range(0, len(str1), 1):
        if i in range(0, len(str2), 1):
            return True
        else:
            return False

它适用于大多数情况,但何时 str1是aaaaaaaaaabbbbbbbbbb,str2是ababababbbababababab,它返回true 当str1为xxxyyyxxx且str2为yyyxxxyyy时,它也会返回True

对于这两起案件应该重新审核False,但我不知道。 有人可以帮我吗?

3 个答案:

答案 0 :(得分:1)

我认为执行此任务的最简单方法是对字符串进行排序并比较它们,如下例所示:

def check_anagram(a = '', b = ''):
    return sorted(a) == sorted(b)

测试1:

a = "python"
b = "nohtyp"
print(check_anagram(a, b))

输出:

>>> True

的Test2:

a = "aaaaaaaaaabbbbbbbbb"
b = "ababababbbababababab"
print(check_anagram(a, b))

输出:

>>> False

Test3的:

a = "xxxyyyxxx"
b = "yyyxxxyyy"
print(check_anagram(a, b))

输出:

>>> False

答案 1 :(得分:0)

您的两个测试用例都返回true,因为在您检查它们存在后,您不会从str2中删除字符。例如,比较以下两个字符串:

str1 = aastr2 = a

我们希望您的比较结果为False,因为它们显然不是字谜。但是,检查a中的两个str1字符中的每一个都会返回True,因为str2还包含a。更好(和更快)的方法可能是首先处理字符串,如下所示:

# return a dictionary, where each key is the 
# count of that letter in the string
def process_str(str):
    dic = {}
    for letter in str:
        if letter in dic:
            dic[letter] += 1
        else:
            dic[letter] = 1
    return dic

def check_anagram(str1, str2):
    dic1 = process_str(str1)
    dic2 = process_str(str2)

    # does every key in dic1 have a corresponding key in dic2?
    for key in dic1:
        if not key in dic2:
            return False
        if not dic1[key] == dic2[key]:
            return False

    # does every key in dic2 have a corresponding key in dic1?
    for key in dic2:
        if not key in dic1:
            return False
        if not dic1[key] == dic2[key]:
            return False

    return True

这应该可以解决问题。

答案 2 :(得分:0)

目前,您的代码将始终返回True。

for i in range(0, len(str1), 1):

这将遍历str1的长度范围,如果字符串是" python" for循环将具有以下值:' i':0,1,2,3,4,5如果要迭代每个字母写

for i in str1:

这将使i:p,y,t,h,o,n的值

或者,如果您使用范围,则可以使用str1 [i]检查单个字母。这将输出以下内容:str1 [0] ==" p",str1 [1] ==" y"等

由于您在if语句中执行相同的操作,因此会检查是否' i'从范围(0,6)等于i。 ' i'的第一个值将是0,在第一次检查后它通过if语句并将返回 True,这意味着它将结束循环。这意味着它只会检查第一种情况。

你要做的是检查str1中的每个字母,如果它在str2中的任何位置,从str2中删除该实例并检查下一个字母。如果在任何时候该字母不在str2中,则返回False。检查完所有字母后,您没有返回False,返回True。

由于字符串是不可变的,您可以先将它们放在列表中,然后遍历列表。

查看以下代码:

def check_anagram(str1, str2):
    if len(str1) != len(str2):
        return False
    else:
        string1 = [x for x in str1] # put str1 in list string1
        string2 = [x for x in str2]
        for i in range(0, len(str2), 1): # iterate over the range (length) of str2
            if string1[i] in string2: # if letter in position i of string1 occurs in string 2 then:
                string2.remove(string1[i]) # remove that letter from the string2 list
            else: 
                return False # if it does NOT occur in string2, it is NOT an anagram, so return false
        return True # If the loop went correctly, return true

编辑: 如果你想删除空格(空格)(因为" ars magna"是#34; anagrams"的字谜,但程序因为长度不同而不能捡起它)你必须在一开始就这样做。替换字符串中的空格可以通过.replace(用什么来替换,替换为)来完成。将其放在check_anagram函数的开头:

str1 = str1.replace(" ", "")
str2 = str2.replace(" ", "")