【问题标题】:Find the most occurring character in a string查找字符串中出现次数最多的字符
【发布时间】:2021-03-19 18:20:53
【问题描述】:

这段代码将在字符串中找到出现次数最多的 chr,它几乎可以通过字典正常工作,但不幸的是,问题是我想让它在有两个键时返回最后一个键相同的频率,但它返回第一个。

这就是我到目前为止所做的:

def most_frequent_letter(s):
    st = s.lower().replace(' ', '')
    frequencies = {}
    for items in st:
        if items in frequencies:
            frequencies[items] += 1
        else:
            frequencies[items] = 1

    return max(frequencies, key=frequencies.get)




most_frequent_letter('mmmaaa')
Out[48]: 'm'

但是我不知道如何返回 'a' 而不是 'm'。

【问题讨论】:

    标签: python string dictionary


    【解决方案1】:

    这是一种创建反向频率字典的方法。我还使用dictionary comprehension 使频率字典及其反向的创建相当简洁:

    def most_frequent_letter(s):
        st = s.lower().replace(' ', '')
        frequencies = {}
        frequencies = {item: frequencies.setdefault(item, 0) + 1 for item in st}
        rev_freq = {count: key for key, count in frequencies.items()}
        return rev_freq[max(rev_freq)]
    
    print(most_frequent_letter('nnmmmaaa'))  # -> a
    

    【讨论】:

    • collections.Counter 会起作用吗?如果是这样会更有效吗?我在下面提供了一个代码。
    • @Prayson:绝对可以使用Counter 来确定频率——它可能比用户编写的任何东西都快,因为它是一个标准库类。不确定利用如何处理具有相同计数的多个项目的反向字典部分 - 但 Counter 类的 most_common() 方法提出了这一点。
    【解决方案2】:

    Python max 函数总是返回第一个最大值。 因此,如果您总是想要最后一个键,那么您可以在代码中反转原始字符串。

    def most_frequent_letter(s):
        st = s.lower().replace(' ', '')
        st = st[::-1]
        frequencies = {}
        for items in st:
            if items in frequencies:
                frequencies[items] += 1
            else:
                frequencies[items] = 1
    
        return max(frequencies, key=frequencies.get)
    

    如果您想要最低值的键,则首先对字符串进行排序。 您也可以只创建自己的 max 函数来满足您的需求。

    【讨论】:

      【解决方案3】:
      def most_frequent_letter(word):
          letters = list(word)
          return (max(set(letters), key = letters.count))
      
      print(most_frequent_letter('mmmaaa'))
      # output:m
      print(most_frequent_letter('some apples are green'))
      # output: e
      

      max() 将返回列表中的最大值。 key 参数采用单个参数函数来自定义排序顺序,在这种情况下,它是 letters.count。该函数应用于迭代器上的每个项目。

      letters.count 是列表的内置函数。它接受一个参数,并将计算该参数的出现次数。所以 letters.count('m') 将返回 3,而 letters.count(a) 将返回 3。

      set(test) 返回来自 test 的所有唯一值,所以 {3, 3}

      所以我们在这一行代码中所做的就是获取 test 的所有唯一值,即 {1, 3}。接下来,max 会对它们应用 list.count 函数并返回最大值。

      【讨论】:

        【解决方案4】:

        是的,你可以同时得到 m 和 a,这取决于你想如何得到输出,但我以一个字符串为例

        def most_frequent_letter(s):
            st = s.lower().replace(' ', '')
            frequencies = {}
            for items in st:
                if items in frequencies:
                    frequencies[items] += 1
                else:
                    frequencies[items] = 1
            max_val=max(frequencies.values())
            result=""
            for key,value in frequencies.items():
                if value==max_val:
                    result+=key
        
            return result
        
        
        result=most_frequent_letter('mmmaaa')
        print(result)
        

        输出将是“ma”

        【讨论】:

          【解决方案5】:

          在 python 中,当您使用 max 函数时,它将返回第一个最大频率,如果您想要第二个最大频率,您可以尝试从列表中删除“m”,这样之后第一个最大频率将是“a”。

          【讨论】:

            【解决方案6】:

            collections 库有 Counter 为您完成这项工作:我们用小写规范化单词并替换反向字符串之前的空格以首先出现最后一次。

            
            from collections import Counter
            
            word = 'mmmaaa'
            characters = Counter(reversed(word.lower().replace(' ', '')))
            
            # most common 
            print(characters.most_common(1))
            
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-03-28
              • 2020-02-21
              • 2015-01-10
              • 1970-01-01
              • 2017-05-08
              • 1970-01-01
              相关资源
              最近更新 更多