[英]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 starter
和Astronomer
实际上不是字谜。
只需使用可用的对象方法,即可大幅改进算法。 他们已经提供了所有功能。
def normalize_str(s):
return s.replace(" ","").lower()
def anagramSolution2(s1,s2):
return sorted(normalize_str(s1)) == sorted(normalize_str(s2))
normalize_str
就像你的deleteSpaces
,但它也将所有内容转换为小写。 这样, Moon
和moon
将相等。 你最后可能想要更严格或更宽松的规范化,这只是一个例子。
对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.