使用key参数按频率排序不按预期工作

时间:2019-06-08 07:55:43

标签: python list sorting

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

我尝试使用key=arr.countarr是我要排序的列表的名称)。它适用于某些输入。我还尝试使用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 1 2 2 2 2 2 2 2 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 5 5 5 5 4 4 4 4 6 6 6

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

2 个答案:

答案 0 :(得分:1)

使用元组首先按频率排序,然后按值排序,要反转顺序,您可以使用(defrule get-y21 "Add 1 to global variable for every yes answer from question21" (answer (ident q21) (text yes )) => (bind ?*countyes* (+ ?*countyes* 1)) ) (defrule get-n21 "Add 1 to global variable for every no answer from question21 " (answer (ident q21) (text no )) => (bind ?*countno* (+ ?*countno* 1)) ) (因此,最小的数字首先出现),然后由于您想要最大的计数首先使用反向:

-

输出:

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

答案 1 :(得分:0)

我认为问题在于某些条目的频率相同,例如:

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