【问题标题】:Python - Compare 2 words and check if they are anagramPython - 比较 2 个单词并检查它们是否是字谜
【发布时间】:2017-08-12 09:35:36
【问题描述】:

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

所以,如果字符串 1 是 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,但我不知道。 有人可以帮我解决这个问题吗?

【问题讨论】:

  • return ''.join(sorted(str1)) == ''.join(sorted(str2))

标签: python-3.x anagram


【解决方案1】:

我认为完成这项任务最简单的方法是对字符串进行排序并像这个例子一样比较它们:

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

【讨论】:

  • 解决我的问题的最简单方法!谢谢。但我不知道我是否能够使用“排序”方法来处理我的作业。不过还是谢谢。
  • 你没有在你的问题中这么说。但是您仍然知道如何使用已排序的字符串来处理它。
  • 如果用户在单词中输入大写字母,这将失败。我们还应该考虑使用 sorted().lower() 或 sorted().upper() 来解决这个问题。
  • 如果它们是字谜,请放一个 and 低于 ckech
【解决方案2】:

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

str1 = aastr2 = a

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

这应该可以解决问题。

【讨论】:

    【解决方案3】:

    目前,您的代码将始终返回 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 语句中执行相同操作,因此它将检查 range(0, 6) 中的 'i' 是否等于 i。 'i' 的第一个值为 0,在第一次检查之后,它通过了 if 语句并将 return 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”是“字谜”的字谜,但由于长度不同,程序不会拾取它),您必须在开始时执行此操作。替换字符串中的空格可以通过 .replace(WHAT TO REPLACE, REPLACE WITH THIS) 函数来完成。把它放在 check_anagram 函数的开头:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2015-05-04
      • 2021-07-22
      • 2017-12-02
      • 1970-01-01
      • 2020-07-17
      • 2014-03-22
      相关资源
      最近更新 更多