Python - 比较 2 个单词并检查它们是否是变位词

Python - Compare 2 words and check if they are anagram

我正在尝试定义一个接受 2 个字符串的函数,比较这两个字符串,如果它们是变位词,则 returns 为 True。我不想导入集合。

所以,如果字符串 1 是 python,字符串 2 是 nohtyp,它应该 return True。否则,显然,returnfalse。到目前为止,这是我的代码:

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,它 return 是真的 当 str1 为 xxxyyyxxx 且 str2 为 yyyxxxyyy 时,它也 returns True.

对于这两种情况,它应该重新运行 False,但我不知道。 有人可以帮我解决这个问题吗?

您的两个测试用例 return 为真,因为您在检查字符存在后没有从 str2 中删除字符。因此,例如比较以下两个字符串:

str1 = aastr2 = a

我们希望您的比较结果是 False,因为它们显然不是变位词。但是,检查 str1 中的两个 a 字符中的每一个都会 return 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

这应该可以解决问题。

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

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

测试 1:

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

输出:

>>> True

测试 2:

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

输出:

>>> False

测试 3:

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

输出:

>>> False

目前,您的代码将始终 return 正确。

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 语句中执行相同的操作,它将检查范围 (0, 6) 中的 'i' 是否等于 i。 'i' 的第一个值将为 0,在第一次检查之后它通过 if 语句并且将为 return True,这意味着它将结束循环。这意味着它只会检查第一种情况。

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

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

查看以下代码:

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" 是 "anagrams" 的变位词,但由于长度不同,程序不会选择它)你必须在开始时这样做。替换字符串中的空格可以通过 .replace(WHAT TO REPLACE, REPLACE WITH THIS) 函数来完成。将其放在 check_anagram 函数的开头:

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