繁体   English   中英

如何编写一个函数来判断两个字符串是否是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM