使用键参数按频率排序,未按预期工作



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

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

>>> 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 1 1 1 2 2 2 2 2 2 2 2 7 7 7 7 7 7 3 3 3 3 3 3 5 5 5

5 4 4 4 6 6 6

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

使用元组首先按频率排序,然后按值排序,为了反转排序,您可以使用-(所以最小的数字排在第一位(,然后因为你想要最大的计数,首先使用反向:

sorted(arr, key=lambda x: (arr.count(x), -x), reverse=True)

输出:

[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]
我认为

问题是某些条目具有相同的频率,例如:

arr.count(1) == arr.count(2) == arr.count(7)

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

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, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 5, 5, 5, 6, 6, 6, 6, 6, 4, 4]

最新更新