![](/img/trans.png)
[英]How to test if two strings are anagrams while being case sensitive in Python?
[英]How to write a function that judges if two strings are anagrams in Python?
该函数的输入是两个字符串,目的是判断这两个字符串是否是字谜。 例如,“ 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
排序以识别一个字符串是否为另一个字母,需要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
您只需要对字符串进行排序:
def is_anagram(string_a, string_b):
return sorted(string_a.lower()) == sorted(string_b.lower())
您可以使用Counter
类:
from collections import Counter
def is_anagram(string_a,string_b):
return Counter(string_a.lower()) == Counter(string_b.lower())
您的代码是“ list(new_b)”错误的,它不会被存储,因此每次它将被视为一个新列表。
而且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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.