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

时间:2016-07-01 06:51:33

标签: python string sorting

我正在处理简单的问题,检查两个字符串是否是字谜。 我写了简单的代码,可以检查,是否有两个字符串,如 '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 

8 个答案:

答案 0 :(得分:7)

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

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.lower()).strip()
    return sort(s1) == sort(s2)

答案 1 :(得分:2)

正如其他人所指出的那样,你的算法被赋予“假”结果Moon starterAstronomer实际上不是字谜。

只需使用可用的对象方法,即可彻底改进算法。他们已经提供了所有功能。

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 s元素(您使用for循环执行的操作),但效率更高。

答案 2 :(得分:1)

这样的东西?

$ 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

答案 3 :(得分:0)

a=input("string1:");
b=input("string2:");

def anagram(a,b):

    arra=split(a)
    arrb=split(b)
    arra.sort()
    arrb.sort()

    if (len(arra)==len(arrb)):

            if(arra==arrb):
                print ("True")
            else:
                ana=0;
                print ("False");

    else:
        print ("False");



def split(x):
    x=x.replace(' ','').lower()
    temp=[]
    for i in x:
        temp.append(i)
    return temp;


anagram(a,b)

答案 4 :(得分:0)

懒惰的方式,但超级干净:

def anagram(a,b):
     return cleanString(a) == cleanString(b)

def cleanString(string):
    return ''.join(sorted(string)).lower().split()

答案 5 :(得分:0)

def anagram(str1,str2):
    l1=list(str1)
    l2=list(str2)
    if sorted(l1) == sorted(l2):
        print("yess")
    else:
        print("noo")
str1='listen'
str2='silent'
anagram(str1,str2)

虽然不是最优化的解决方案,但效果很好。

答案 6 :(得分:0)

我找到了最好的方法:

from collections import Counter

def is_anagram(string1, string2):
    return Counter(string1) == Counter(string2)

答案 7 :(得分:-1)

我试过这个并且有效

def is_anagram(word1,word2):
        a = len(word1)
        b = len(word2)
        if a == b:
            for l in word1:
                if l in word2:
                    return True
        return False