首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取列表中所有元素平均值的最有效方法,其中每个元素出现的次数至少是列表模式的一半。

获取列表中所有元素平均值的最有效方法,其中每个元素出现的次数至少是列表模式的一半。
EN

Stack Overflow用户
提问于 2016-09-24 22:57:40
回答 2查看 118关注 0票数 0

我在python中有一个特定的任务要执行。效率和速度是这里最重要的,这就是为什么我张贴这个问题。

我需要获得列表中项目的平均值,但只需要获得至少是列表模式发生的一半的项目的平均值。

例如,如果列表是[1,2,2,3,4,4,4,4],我需要得到2,2,4,4,4,4的平均值。由于4是列表的模式,并且发生了四次,所以唯一至少发生了四次(两次)的元素是2。因此,我对所有出现的13进行了折扣,并对列表进行了平均处理。

我不知道最有效的方法是什么。我知道如何强行计算解决方案,但这显然不是最快的实现。

我认为最好使用numpy数组,但是由于我会经常添加到列表中,所以我认为这不是最好的选择。

我的其他想法是可能使用来自collections模块的基于collections的方法。但再次,我不知道这是最快或最明智的执行这样一个相当奇怪的计算。

EN

Stack Overflow用户

发布于 2016-09-25 02:53:33

如果您决定使用numpy,下面是使用numpy.uniquenumpy.average的简明方法

代码语言:javascript
运行
复制
In [54]: x = np.array([1, 2, 2, 3, 4, 4, 4, 4])

In [55]: uniqx, counts = np.unique(x, return_counts=True)

In [56]: keep = counts >= 0.5*counts.max()

In [57]: np.average(uniqx[keep], weights=counts[keep])
Out[57]: 3.3333333333333335

请注意,np.unique对其参数进行了排序,因此其时间复杂度为O(n*log(n)),而这个问题可以用O(n)的算法来解决。使用具有典型长度的数组进行定时比较,然后根据其渐近时间复杂性排除这种方法。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39681725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档