繁体   English   中英

如何检查两个单词是否是字谜python

[英]How to check whether two words are anagrams python

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

  • 检查两个字符串是否是字谜。

我写了一个简单的代码,可以检查两个字符串,例如'abcd'和'dcba'是否是字谜,但我不知道如何处理更复杂的字符串,如“Astronomer”和“Moon starter”。

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 

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

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)

正如其他人已经指出的那样,你的算法被给予“假”结果,因为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的元素(你正在用for循环做什么),但更有效。

像这样的东西?

$ 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
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)

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

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

def cleanString(string):
    return ''.join(sorted(string)).lower().split()
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)

虽然不是最优化的解决方案,但工作正常。

我发现这是最好的方法:

from collections import Counter

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

我试过这个并且它有效

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM