【问题标题】:How to return elements with the highest occurrence in list?如何返回列表中出现次数最多的元素?
【发布时间】:2016-04-09 11:43:56
【问题描述】:

所以我试图创建一个函数,它将接受一个参数 numlist(一个非空的数字列表),并返回在 numlist 中出现频率最高的排序的数字列表。

到目前为止,我已经设法创建了一个字典(数字作为键,它们的频率作为值)。但是我仍然想找出其中哪一个具有最大值并将其返回。问题是我不知道如何比较它们。现在有一些这样的单行

max(stats, key=stats.get)

但是,如果有多个值满足该要求怎么办?

mode([5, 1, 1, 5])
#I'm guessing this should return [1, 5] if sorted...

你会如何处理它?感谢您提供任何帮助!

这是我的代码:

def mode(numlist):

    mylist = numlist
    dic = {}

    for num in mylist:
        if num in dic:
            dic[num] += 1
        else:
            dic[num] = 1
     # try to get the max value and return them in a set form like [1, 0]    

【问题讨论】:

  • 因此,如果您有多个最大值,您想在列表中返回多个最大值吗?就像 6 和 7 出现的最大次数一样?
  • @idjaw 是的,没错
  • 您能否在您的问题中添加示例输入和期望输出?
  • @Kasramvd 上面有一个。该模式需要 [1, 5] 输出我检查了要求。很抱歉造成混乱。

标签: python list python-3.x


【解决方案1】:

您可以使用Counter,它返回类似dict 的对象,其中元素存储为字典键,其计数存储为字典值。

from collections import Counter

def mode(my_list):
    ct = Counter(my_list)
    max_value = max(ct.values())
    return sorted(key for key, value in ct.items() if value == max_value)

演示:

In [46]: mode([5, 1, 1, 5])
Out[46]: [1, 5]

【讨论】:

  • 为什么不在上面的函数示例中只返回max_value?
【解决方案2】:

坚持您当前的实现,您可以对字典的值进行排序,然后只获取与该最大值匹配的字典的所有键:

因此,您可以在方法结束时执行以下操作:

vals = max(dic.values())
return [k for k, v in dic.items() if v == vals]

vals 将保存最大值以指示这是重复项的值。然后我们创建一个列表推导式,它通过字典获取与该值匹配的所有键。

把它放在一起:

def mode(numlist):

    mylist = numlist
    dic = {}

    for num in mylist:
        if num in dic:
            dic[num] += 1
        else:
            dic[num] = 1

    vals = max(dic.values())
    return [k for k, v in dic.items() if v == vals]


print(mode([5, 1, 1, 5]))

输出:

[1, 5]

【讨论】:

    【解决方案3】:

    你可以使用collections.Counter:

    from collections import Counter
    
    def mode(num_list):
        max_value = float('-inf')
        maxes = None
        for key, value in Counter(num_list).items():
            if value == max_value:
                maxes.add(key)
            elif value > max_value:
                max_value = value
                maxes = {key}
    
        return maxes
    
    
    print(mode([1, 3, 3, 1, 2]))
    

    如果订单很重要,请使用[key] 代替{key}maxes.append(key) 代替maxes.add(key)

    【讨论】:

      【解决方案4】:

      那么你可以使用的单线是

      def mode(num_list):
          return max(num_list, key = num_list.count)
      

      但正如你所说,它不适用于具有相同出现次数的多个数字。

      我更喜欢继续使用列表而不是字典。下面的函数将返回一个列表,其中包含所有出现次数最多的数字。

      def mode(num_list):
      
          # Make list of tuples with their values and no. occurrences
          # num_list = [5, 1, 1, 5, 5]
          # max_ocur = [(1, 2), (5, 3)]
          max_ocur = [(i, num_list.count(i)) for i in num_list]
      
          # Set to remove duplicates
          max_ocur = set(max_ocur)
      
          # Find the max number of occurrences
          m = max(max_ocur, key = lambda x: x[1])[1]
      
          # Get list of all numbers in max_ocur that have highest occurrence
          modes = [i for i, ocur in max_ocur if ocur == m]
      
          modes.sort() # Sort if you want
      
          return modes
      

      或者您可以使用短版本。我不确定我更喜欢哪一个,我做了上面的那个,因为两次使用list.count 感觉效率低下。但我不确定哪个更有效。

      def mode(num_list):
      
          max_ocur = max([num_list.count(i) for i in num_list])
      
          return [i for i in set(num_list) if num_list.count(i) == max_ocur]
      

      如果即使您在列表中只有一个出现次数最多的数字,并且您希望返回数字本身而不是只有一个数字的列表,那么您可以这样做

      return modes if len(modes) > 1 else modes[0] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        • 2020-01-29
        • 2020-07-22
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        相关资源
        最近更新 更多