如何检查两个单词是否为anagrams python

2024-06-08 15:55:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在处理一个简单的问题:

  • 检查两个字符串是否为anagram。

我编写了一个简单的代码,可以检查两个字符串,比如 “abcd”和“dcba”是一个字谜,但我不知道如何处理更复杂的字谜,比如“天文学家”和“月球启动者”

line1 = input('Enter the first word: ')
line2 = input('Enter the second word: ')

def deleteSpaces(s):
    s_new = s.replace(" ","")
    return s_new


def anagramSolution2(s1,s2):
    alist1 = list(deleteSpaces(s1))
    alist2 = list(deleteSpaces(s2))

    print(alist1)
    print(alist2)

    alist1.sort()
    alist2.sort()

    pos = 0
    matches = True

    while pos < len(deleteSpaces(s1)) and matches:
        if alist1[pos]==alist2[pos]:
            pos = pos + 1
        else:
            matches = False

    return matches

首先,我认为问题在于使用空格,但后来我明白,如果字符串大小不同,我的算法就不起作用。

我不知道在那种情况下该怎么办。

在这里,我找到了一个很好的解决方案,但也不管用:

def anagrams(s1,s2):
    return [False, True][sum([ord(x) for x in s1]) == sum([ord(x) for x in s2])]

如果我运行这个函数并在两个字符串上测试它,我将得到这样的输出:

Examples:

First Word: apple
Second Word: pleap

output: True

First Word: Moon starter
Second Word: Astronomer

output: False //however it should should be True because this words are anagrams 

Tags: 字符串posfalsetrueinputreturndefword
3条回答

正如其他人所指出的,由于Moon starterAstronomer实际上是而不是anagrams,所以您的算法被给出“假”结果。

只需使用可用的对象方法,就可以大大改进算法。它们已经提供了所有的功能。

def normalize_str(s):
  return s.replace(" ","").lower()

def anagramSolution2(s1,s2):
  return sorted(normalize_str(s1)) == sorted(normalize_str(s2))

normalize_str与您的deleteSpaces类似,但它也将所有内容转换为小写。这样,Moonmoon将比较相等。最后,您可能希望执行更严格或更宽松的规范化,这只是一个示例。

sorted的调用已经为您提供了一个list,您不必执行显式转换。此外,通过==进行的list比较将比较list的元素(您使用for循环所做的操作),但效率更高。

你的算法没问题。你的问题是你不考虑大写和小写字母。改变这两条线

alist1 = list(deleteSpaces(s1))
alist2 = list(deleteSpaces(s2))

alist1 = list(deleteSpaces(s1).lower())
alist2 = list(deleteSpaces(s2).lower())

会解决你的问题。 作为替代方案,您可以简单地使用以下函数:

def anagrams(s1, s2):
    def sort(s):
        return sorted(s.replace(" ", "").lower())
    return sort(s1) == sort(s2)

如果您希望有一个复杂度为O(n)的更快的解决方案,应该使用计数器而不是对这两个字进行排序:

from collections import Counter

def anagrams(s1, s2):
    def get_counter(s):
        return Counter(s.replace(" ", "").lower())

    return get_counter(s1) == get_counter(s2)

像这样的?

$ cat /tmp/tmp1.py
#!/usr/bin/env python

def anagram (first, second):
    return sorted(first.lower()) == sorted(second.lower())

if __name__ == "__main__":
    for first, second in [("abcd  rsh", "abcd x rsh"), ("123 456 789", "918273645  ")]:
        print("is anagram('{0}', '{1}')? {2}".format(first, second, anagram(first, second)))

它给出:

$ python3 /tmp/tmp1.py
is anagram('abcd  rsh', 'abcd x rsh')? False
is anagram('123 456 789', '918273645  ')? True

相关问题 更多 >