如何编写一个函数来判断两个字符串是否是python中的字谜?

时间:2015-03-22 20:29:18

标签: python anagram

这个函数的输入是两个字符串,目的是判断这两个字符串是否是字谜。例如," 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

4 个答案:

答案 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