【问题标题】:How to write a function that judges if two strings are anagrams in Python?Python中如何编写判断两个字符串是否为字谜的函数?
【发布时间】:2015-05-25 19:22:51
【问题描述】:

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

【问题讨论】:

    标签: python anagram


    【解决方案1】:

    排序以识别一个字符串是否是另一个字符串的变位词,需要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
    

    【讨论】:

      【解决方案2】:

      您只需对字符串进行排序:

      def is_anagram(string_a, string_b):
          return sorted(string_a.lower()) == sorted(string_b.lower())
      

      【讨论】:

        【解决方案3】:

        您可以使用Counter 类:

        from collections import Counter
        
        def is_anagram(string_a,string_b):
            return Counter(string_a.lower()) == Counter(string_b.lower())
        

        【讨论】:

          【解决方案4】:

          你的代码被“list(new_b)”弄错了,它没有被存储,所以每次它都会被视为一个新的列表。

          while 循环中的“break”也不是必须的。

          请尝试以下代码:

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-31
            • 1970-01-01
            • 2010-11-21
            • 1970-01-01
            • 2011-07-31
            • 2010-09-21
            • 1970-01-01
            • 2021-01-11
            相关资源
            最近更新 更多