首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用不按预期工作的键参数按频率排序

使用不按预期工作的键参数按频率排序
EN

Stack Overflow用户
提问于 2019-06-08 07:55:43
回答 2查看 169关注 0票数 2

给定的数组将根据其元素出现的频率进行排序。

我尝试使用key=arr.count (arr是我想要排序的列表的名称)。它适用于某些输入。我还尝试使用collections.Counter()类对象,它的行为与arr.count的行为类似。

代码语言:javascript
代码运行次数:0
运行
复制
>>> arr = [6, 4, 6, 4, 4, 6, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 1, 7, 7, 7, 2, 2, 2, 7, 1, 7, 1, 2, 1, 2, 7, 1, 1, 7, 2, 1, 2]
>>> sorted(arr, key=arr.count)
[6, 4, 6, 4, 4, 6, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 1, 7, 7, 7, 2, 2, 2, 7, 1, 7, 1, 2, 1, 2, 7, 1, 1, 7, 2, 1, 2]
>>> sorted(arr, key=counts.get)
[6, 4, 6, 4, 4, 6, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 1, 7, 7, 7, 2, 2, 2, 7, 1, 7, 1, 2, 1, 2, 7, 1, 1, 7, 2, 1, 2]

预期产出如下:

1 1 1 2 2 2 7 7 7 3 3 3 5 5 5 4 4 4 6 6 6

不知道我在这里做错了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-08 07:58:43

使用元组先按频率排序,然后按值排序,为了倒序,您可以使用- (因此最小的数字优先),然后因为您想要最大的计数,首先使用反向:

代码语言:javascript
代码运行次数:0
运行
复制
sorted(arr, key=lambda x: (arr.count(x), -x), reverse=True)

输出:

代码语言:javascript
代码运行次数:0
运行
复制
[1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 4, 4, 4, 6, 6, 6]
票数 2
EN

Stack Overflow用户

发布于 2019-06-08 08:22:05

我认为问题是有些条目的频率是相同的,例如:

代码语言:javascript
代码运行次数:0
运行
复制
arr.count(1) == arr.count(2) == arr.count(7)

为了确保这些条目保持分组,您不仅必须根据计数进行排序,还必须按值进行排序:

代码语言:javascript
代码运行次数:0
运行
复制
counts = collections.Counter(arr)
sorted(arr, key=lambda x: (counts[x], x), reverse=True)

产出: 7、7、7、7、7、7、2、2、2、2、2、2、1、1、1、1、1、1、3、3、3、3、3、5、5、5、5、6、6、6、4、4、4、4

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

https://stackoverflow.com/questions/56504582

复制
相关文章

相似问题

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