找一个序列中出现次数最多的元素

有两种方式可以找到,分别是Counter.most_common()和stats.mode()。都需要导入相应的模块包。

下面将分别介绍:
1、Counter.most_common()找出一个序列中出现次数最多的元素,Counter类目的是用来跟踪值出现的次数,它是就是一个无序的容器类型。以字典的键值对形式存储,元素作为key ,出现的次数作为value。
2、Scipy模块里面的stats.mode()函数寻找序列出现次数最的元素,如果多个成员出现的次数一样多,那么返回成员值最小的那个。

 #找稳定的值进行与学生上传的值比较,满足误差范围算对。
 from collections import Counter
 from scipy import stats
 #数值listMeteNopad可自行定义、float(answers_list[0][0])/2==7常量亦可自行定义。
 mode_list = [] #定义的列表。
 for itme in range(0, len(listMeteNopad) - 1): 
     #遍历我自己需要的稳定值范围(出现次数最多的数)
     if listMeteNopad[itme] > float(answers_list[0][0])/2: 
           #float(answers_list[0][0])/2这是一个常量,自己规定。
           mode_list.append(listMeteNopad[itme])
#输出两种情况找到的数。
print('listMeteNopad','\n',listMeteNopad)
print('55555555:',Counter(mode_list).most_common(1),round(stats.mode(mode_list)[0][0], 1))
listMeteNopad:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1657.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 7.0, 7.0, 7.0, 20.2, 73.0, 98.5, 98.5, 98.5, 105.1, 105.1, 104.3, 104.3, 104.3, 104.3, 104.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.5, 1.1, 3.2, 4.6, 4.6, 4.6, 6.0, 10.2, 11.2, 11.9, 11.9, 12.4, 12.7, 13.0, 13.0, 13.1, 13.1, 13.3, 13.5, 13.5, 13.5, 13.5, 13.5, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.5, 13.8, 13.8, 13.9, 14.0, 14.0, 14.1, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.3, 14.2, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.3, 14.3, 14.3, 14.2, 14.2, 14.2, 14.2, 14.2, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3]

55555555: 14.2 14.2

再看一个例子:

print('listMeteNopad','\n',listMeteNopad)

print('55555555:',Counter(listMeteNopad).most_common(3),
round(stats.mode(listMeteNopad)[0][0], 1))
listMeteNopad 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1657.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 7.0, 7.0, 7.0, 20.2, 73.0, 98.5, 98.5, 98.5, 105.1, 105.1, 104.3, 104.3, 104.3, 104.3, 104.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.5, 1.1, 3.2, 4.6, 4.6, 4.6, 6.0, 10.2, 11.2, 11.9, 11.9, 12.4, 12.7, 13.0, 13.0, 13.1, 13.1, 13.3, 13.5, 13.5, 13.5, 13.5, 13.5, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.5, 13.8, 13.8, 13.9, 14.0, 14.0, 14.1, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.3, 14.2, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.2, 14.3, 14.3, 14.3, 14.2, 14.2, 14.2, 14.2, 14.2, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3, 14.3]
 
55555555: [(0, 98), (14.3, 47), (14.2, 46)] 
 0.0

可以看出前者可以以键值对的形式返回多个值,后者确始终返回一个出现次数最多的数。前者适用于序列中稳定值不止一个的情况,需要结合循环去判断,找出自己需要的稳定值。自己可以选择喜欢的模块使用,希望此文对你(您)有帮助。

还望各位大佬多多指教!小生有理了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用哈希表来解决这个问题。遍历整个序列,将每个元素作为键,出现次数作为值存入哈希表。然后遍历哈希表,出现次数最多的元素即可。 具体步骤如下: 1. 创建一个空的哈希表。 2. 遍历整个序列,对于每个元素: a. 如果该元素已经在哈希表,将其对应的值加1。 b. 如果该元素不在哈希表,将其作为键,值设为1存入哈希表。 3. 遍历哈希表,出现次数最多的元素。 a. 初始化最大出现次数为,最多出现元素为空。 b. 对于哈希表的每个键值对,如果该键对应的值大于最大出现次数,则更新最大出现次数和最多出现元素。 4. 返回最多出现元素。 注意:如果有多个元素出现次数相同且都是最多出现次数,则返回其任意一个即可。 ### 回答2: 对于求解一个序列出现次数最多的元素问题,我们可以使用哈希表来解决。具体步骤如下: 首先,需要遍历序列,将序列每个元素及其出现次数记录到哈希表。哈希表的键为序列元素,值为元素序列出现次数。 接下来,遍历哈希表,到值最大的键,即为出现次数最多的元素。 具体实现,可以用一个字典来作为哈希表的实现,遍历序列时,对于每个元素,查看字典是否存在该元素,如果存在,则将其对应的值增加1,否则将其添加到字典,并将其对应的值初始化为1。 遍历完序列后,再对字典进行一次遍历,到值最大的键,即为出现次数最多的元素。 需要注意的是,当序列为空时,需要特殊处理,可以返回None或者抛出异常。此外,如果有多个元素出现次数相同,可以任选一个作为出现次数最多的元素。 综上所述,使用哈希表是一种快速、简便且可靠的方法来解决求解一个序列出现次数最多的元素问题。 ### 回答3: 求解一个序列出现次数最多的元素问题,是一个经典的问题,也是数据结构一个比较重要的问题。解决这个问题的方法有很多,下面将会介绍几种常见的方法。 首先,最简单的方法就是暴力枚举。我们可以用两层循环嵌套,分别遍历序列每一个元素和它之后的元素,统计每个元素出现次数。时间复杂度是$O(n^2)$,因此仅适用于数据规模较小的情况。 其次,我们可以用哈希表来解决这个问题。我们可以用一个哈希表来记录每个元素出现次数,然后出现次数最多的元素。时间复杂度是$O(n)$,空间复杂度是$O(n)$。 第三种方法是使用摩尔投票法。这个方法适用于出现次数最多的元素超过数组长度的一半的情况。我们可以用一个候选元素和它出现次数来做比较,如果当前元素和候选元素相同,就增加计数器,否则就减少计数器。如果计数器变为0,就将下一个元素作为候选元素。时间复杂度是$O(n)$,空间复杂度是$O(1)$。 最后,我们可以使用堆来解决这个问题。我们可以用最大堆来维护每个元素出现次数,然后到堆顶元素即可。时间复杂度是$O(nlogn)$,空间复杂度是$O(n)$。 综上所述,选择哪种方法来解决这个问题,需要根据具体的应用场景和数据规模来决定。对于数据规模较小的情况,可以使用暴力枚举或哈希表法;对于出现次数最多的元素超过数组长度的一半的情况,可以使用摩尔投票法;对于数据规模较大的情况,可以使用堆来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值