【问题标题】:How to compare character frequency and return the most occurring character?如何比较字符频率并返回出现次数最多的字符?
【发布时间】:2019-07-07 10:03:20
【问题描述】:

我正在尝试构建一个函数,该函数返回给定字符串中出现次数最多的字符,并且运行良好,但是如果字符频率相同,我如何返回 None

喜欢输入:'abac'
预期输出为:'a'

输入:'abab'
预期输出为:None

我尝试过使用字典来存储字符频率,然后返回具有最大值的元素。

def most_occuring_char(str1):
    count = {}
    max = 0
    c = ''

    for char in str1:
        if char in count.keys():
            count[char]+=1
        else:
            count[char] = 1

    for char in str1:
        if max < count[char]:
            max = count[char]
            c = char

    return c

我不知道如何检查count字典元素是否具有相同的频率。

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您可以使用collections.Counter 对字典进行计数。
    您基本上只需要添加一个检查以查看最大计数是否唯一(如果是,则返回出现次数最多的 char)或不是(如果是,则返回 None):

    from collections import Counter
    
    def most_occurring_char(string):
        counter = Counter(string)
        max_char_count = max(counter.values())
        is_unique = len([char_count for char_count in counter.values() if char_count == max_char_count]) == 1
        if is_unique:
            char = [char for char, count in counter.items() if count == max_char_count][0]
            return char        
        return None
    
    # Tests
    assert most_occurring_char('abac') == 'a'
    assert most_occurring_char('abab') is None
    

    【讨论】:

      【解决方案2】:

      一旦你有一个包含每个字符计数的字典(在你的第一个 for 循环之后),你可以检查它以确定某些计数是否相同。

      如果您希望仅在所有字符数相同时返回 None,您可以从字典中提取值(即字符数),对它们进行排序,使其按数字顺序排列,然后比较第一个和最后的值。由于它们是排序的,如果第一个和最后一个值相同,那么所有中间值也是相同的。这可以使用以下代码完成:

      count_values = sorted(count.values())
      if count_values[0] == count_values[-1]: return None
      

      如果您希望在没有单个最常用字符时返回None,则可以将排序列表的最后一个值与倒数第二个值进行比较。如果它们相等,则有两个或多个最常出现的字符。这部分的代码与上面的代码非常相似。

      count_values = sorted(count.values())
      if count_values[-1] == count_values[-2]: return None
      

      【讨论】:

        【解决方案3】:

        另一种可能性:

        def most_occuring_char(s):
          from collections import Counter
          d = Counter(s)
          k = sorted(d, key=lambda x:d[x], reverse=True)
          if len(k) == 1: return k[0]
          return None if len(k) == 0 or d[k[0]] == d[k[1]] else k[0]
        
        #Test
        print(most_occuring_char('abac'))       #a
        print(most_occuring_char('abab'))       #None (same frequencies)
        print(most_occuring_char('x'))          #x
        print(most_occuring_char('abcccba'))    #c
        print(most_occuring_char(''))           #None (empty string)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 2019-03-04
          • 2019-06-23
          • 1970-01-01
          • 2020-06-01
          相关资源
          最近更新 更多