【问题标题】:Creating an anagram function创建一个字谜函数
【发布时间】:2019-07-27 17:03:12
【问题描述】:

已经尝试了两个小时左右,似乎无法弄清楚如何在不使用 sorted() 的情况下创建一个字谜函数。试图在不使用 splice、.find()、.count()、.replace() 和 sorted() 的情况下弄清楚它。 目前我有哪些工作:

def anagram(anag1, anag2):
    if (sorted(anag1) == sorted(anag2)):
        return True
    else:
        return False

如果有人有办法在没有排序的情况下做到这一点,那就太好了。

【问题讨论】:

标签: python


【解决方案1】:

使用Counter

from collections import Counter

def anagram(str_1, str_2):
   return Counter(str_1) == Counter(str_2)

【讨论】:

    【解决方案2】:

    使用 counter 为每个输入字符串制作字典,然后我们可以比较这些字典,如果没有任何区别,则它是 anagram,否则不是。

    from collections import Counter
    
    def anagram(ang1,ang2):
    
        count_list1 = Counter(ang1)
        count_dict1 = dict(count_list1)
    
        count_list2 = Counter(ang2)
        count_dict2 = dict(count_list2)
    
        dict_compare_length = len(count_dict1.items() - count_dict2.items())
    
        if dict_compare_length==0:
            return True
        else:
            return False
    
    print(anagram('listen','silen'))
    

    【讨论】:

      【解决方案3】:

      我假设您希望看到一个没有任何花哨的集合或函数的解决方案。只是原始数据类型、循环和条件。那么,怎么样...

      def count(word):
        map = {}
        for e in word:
          if e not in map:
            map[e] = 0
          map[e] += 1
        return map
      
      def anagram(a, b):
        c1 = count(a)
        c2 = count(b)
        return all(c1[k] == c2[k] for k in c1)
      

      制作一个字典,列出每个元素的编号,然后比较两者中的编号是否相同。

      【讨论】:

        【解决方案4】:

        我更喜欢您问题中的sorted 方法以及collections.Counter 方法更好,但如果您只是在寻找替代方法,您可以使用re.findall 来确定第一个单词中的每个字符是否与相同第二个词的频率。

        例如:

        import re
        
        def is_anagram(a, b):    
            return all(re.findall(c, a) == re.findall(c, b) for c in a)
        
        print(is_anagram('cinema', 'iceman'))
        #True
        

        【讨论】:

        • 根据@AdamSmith 的良好评论使用替代方法编辑答案,发现原始方法存在缺陷(有关上下文,请参阅编辑历史记录中的原文)。
        【解决方案5】:

        尝试使用all 和内部的生成器检查相等性:

        def anagram(anag1, anag2):
            if all(len([i for a in anag1 if a == i]) == len([i for b in anag2 if b == i]) for x in zip(anag1,anag2) for i in x):
                return True
            else:
                return False
        print(anagram('car','arc'))
        

        输出:

        True
        

        【讨论】:

        • 遗憾的是,我无法使用排序方法...如果可以的话会容易得多。
        • @MasonDesconi 编辑了我的答案
        • Ack,你有一个比我更好的。不过,只需返回 all 的结果即可。
        • @Multihunter 哈哈
        • @MasonDesconi 为什么你不赞成所有人
        猜你喜欢
        • 2016-06-14
        • 2018-03-22
        • 2019-04-16
        • 2014-12-19
        • 2014-03-08
        • 2016-02-01
        • 2013-12-07
        • 2016-11-10
        • 2023-03-09
        相关资源
        最近更新 更多