我正在尝试定义一个带2个字符串的函数,比较这两个字符串,如果它们是anagram则返回True。我不想导入馆藏。
因此,如果string1为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
,但我不知道。
有人可以帮我吗?
答案 0 :(得分:1)
我认为执行此任务的最简单方法是对字符串进行排序并比较它们,如下例所示:
def check_anagram(a = '', b = ''):
return sorted(a) == sorted(b)
测试1:
a = "python"
b = "nohtyp"
print(check_anagram(a, b))
输出:
>>> True
的Test2:
a = "aaaaaaaaaabbbbbbbbb"
b = "ababababbbababababab"
print(check_anagram(a, b))
输出:
>>> False
Test3的:
a = "xxxyyyxxx"
b = "yyyxxxyyy"
print(check_anagram(a, b))
输出:
>>> False
答案 1 :(得分:0)
您的两个测试用例都返回true,因为在您检查它们存在后,您不会从str2中删除字符。例如,比较以下两个字符串:
str1 = aa
和str2 = a
我们希望您的比较结果为False
,因为它们显然不是字谜。但是,检查a
中的两个str1
字符中的每一个都会返回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
这应该可以解决问题。
答案 2 :(得分:0)
目前,您的代码将始终返回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语句中执行相同的操作,因此会检查是否' i'从范围(0,6)等于i。 ' i'的第一个值将是0,在第一次检查后它通过if语句并将返回 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"是#34; anagrams"的字谜,但程序因为长度不同而不能捡起它)你必须在一开始就这样做。替换字符串中的空格可以通过.replace(用什么来替换,替换为)来完成。将其放在check_anagram函数的开头:
str1 = str1.replace(" ", "")
str2 = str2.replace(" ", "")