这个函数的输入是两个字符串,目的是判断这两个字符串是否是字谜。例如," qwerty"和" qetyrw"是字谜,这意味着重新排列第一个字符串中的字符可以得到第二个字符串。并且不要求区分大小写。 " QWERTY"和" QWerTY"也是字谜。我只是混淆了我的功能,什么也没有返回。 我的功能如下:
def is_anagram(string_a,string_b):
"""returns True if the strings are anagrams of each other
str, list -> boolean"""
new_a=string_a.lower()
new_b=string_b.lower()
i=0
if len(string_a)!=len(string_b):
return False
else:
while i<=len(new_a)-1:
if new_a[i] in new_b:
list(new_b).remove(new_a[i])
i=i+1
break
if len(list(new_b))==0:
return True
else:
return False
答案 0 :(得分:5)
排序以识别字符串是否是另一个字符串的字谜,需要O(n logn)
次。相反,我们可以使用计数器对象来计算每个字母的出现次数:
from collections import Counter
def is_anagram(string_a, string_b):
return Counter(string_a.lower()) == Counter(string_b.lower())
这将取平均线性时间。基本观察是两个字谜字符串具有完全相同的字母频率。
示例:
>>> is_anagram("abc", "aaa")
False
>>> is_anagram("abc", "aac")
False
>>> is_anagram("abc", "acb")
True
答案 1 :(得分:3)
您只需对字符串进行排序:
def is_anagram(string_a, string_b):
return sorted(string_a.lower()) == sorted(string_b.lower())
答案 2 :(得分:1)
您可以使用Counter
类:
from collections import Counter
def is_anagram(string_a,string_b):
return Counter(string_a.lower()) == Counter(string_b.lower())
答案 3 :(得分:0)
你的代码错误的是&#34; list(new_b)&#34;,它没有被存储,因此每次它都会被视为新列表。
&#34;休息&#34;在while循环中也没有必要。
请尝试以下代码:
def is_anagram(string_a,string_b):
"""returns True if the strings are anagrams of each other
str, list -> boolean"""
new_a=string_a.lower()
new_b=string_b.lower()
i=0
if len(string_a)!=len(string_b):
return False
else:
list_b = list(new_b) # store the list(new_b) into list_b
while i<=len(new_a)-1:
if new_a[i] in list_b:
list_b.remove(new_a[i])
i=i+1
#break should be removed!
if len(list_b)==0:
return True
else:
return False