【问题标题】:Number with highest frequency in a list列表中出现频率最高的数字
【发布时间】:2018-09-05 22:37:36
【问题描述】:

我正在尝试编写一个程序来显示列表中出现频率最高的数字。我试图在不导入任何库的情况下做到这一点。到目前为止,我有一些东西可以给我最常见的 # 出现的次数,但我想要这个数字本身,而不是它出现的次数。我怎样才能以一种简单的方式改变我目前拥有的东西?

def freq(L):
    st = []
    L.sort()
    for i in L:
        st.append(L.count(i))
    print max(st)

编辑:例如,freq([4, 6, 4, 3, 9, 1, 4]) 返回 3,因为 4 出现了 3 次。但我希望它以最常见的值返回 4。

【问题讨论】:

  • 可能是浮点数还是严格整数?
  • 使用collections.Counter 替换您编写的大部分代码——它为您提供了一个包含列表中每个项目频率的字典。颠倒听写。将max 应用于密钥。现在只需将其用作反向字典的索引。这将返回一个最常见的项目。
  • 当您说“不导入任何库”时,是否包括标准库中的模块,例如collections.Counter?如果是这样,您为什么要避免使用这些库?这是一个学习练习吗?
  • 您好,您能举一个输入数据的示例以及您希望输出的内容吗?
  • @Prune,请注意 Counter 确实有一个 most_common 方法,这意味着无需手动计算您的值的最大值。

标签: python python-3.x python-2.7 list counter


【解决方案1】:

试试字典

def freq(L):
     st = {}
     for i in set(L):
        st.update({L.count(i):i})
     print (st.get(max(st)))

或更短:

def freq(L):
    st={L.count(i):i for i in set(L)}
    print (st.get(max(st)))

另一种没有字典的解决方案:

def freq(L):
    a=0
    b=None
    for e in set(L):
        if L.count(e)>a:
            a=L.count(e)
            b=e
    print(b)

【讨论】:

    【解决方案2】:

    list.count 具有 O(n) 复杂度,给定列表中的 n 个值。如果有 m 个唯一值,这意味着您的算法将具有最小 O(m x n) 复杂度。这是不可取的。

    一个 O(n) 解决方案是创建一个计数字典并在迭代时递增值:

    lst = [1, 2, 3, 3, 3, 2, 1, 3, 3]
    
    def freq(L):
        d = {}
        for num in L:
            d[num] = d.get(num, 0) + 1
        maxcount = max(d.values())
        return next(k for k, v in d.items() if v == maxcount)
    
    freq(lst)  # 3
    

    当然,collections.Counter 的语法很简单:

    from collections import Counter
    
    def freq(L):
        return Counter(L).most_common()[0][0]
    

    【讨论】:

      【解决方案3】:

      这是使用列表推导的一种方法:

      mostFrequentNumber = L[max([(L.count(d), i) for i, d in enumerate(L)])[1]]

      分解:

      我们迭代列表的枚举版本: i, d in enumerate(L),它将生成具有值和索引的元组。然后我们使用dcount 和索引i: (L.count(d), i) 创建一个元组列表。我们使用 Max 函数来获取计数最高的那个。然后我们使用元组中索引[1] 处的最高值对列表L 进行索引。

      这个输入:L = [1, 1, 1, 2, 3, 4] 然后将产生 1 作为结果,尽管可能不是最有效的。

      【讨论】:

        【解决方案4】:

        我认为这是最简单的解决方法:

        from statistics import mode
        
        def freq(L):
            return mode(L) 
        

        【讨论】:

          【解决方案5】:

          不要使用列表st = [],而是使用字典dt = {}。 此外,在您的情况下,在 set 上循环的性能比遍历所有 list 元素要好,count 方法为您执行此操作,只需循环在 set 上。 最后得到字典dt的最大值索引:

          def freq(L):
              dt = {}
              for i in set(L):
                  dt[i] = L.count(i)
              return max(dt, key=lambda k: dt[k])
          
          print(freq([4, 6, 4, 3, 9, 1, 4])) #4
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-01
            • 2019-07-16
            • 2019-08-31
            相关资源
            最近更新 更多