如何使用 Python 中的比较器按频率对整数列表进行排序?

How to sort a list of integers by frequncy using comparators in Python?

我编写了一个程序,可以根据元素出现的频率对给定的整数列表进行排序。那就是频率较高的元素排在第一位。如果两个元素的频率相同,则较小的数字在前。

但是我的代码没有正确打印输出 我使用了比较器并导入了 functools 库,并使用子函数 cmp_to_key 生成了最终结果。

这是我的代码

class Element:
    def __init__(self, val, freq, idx):
        self.val = val
        self.freq = freq
        self.idx = idx

import functools

class Solution:
    def sortElements(self, array):
        frequency = self.findFrequencies(array)
        elements=[]
        for i in range(len(array)):
            val = array[i]
            freq = frequency[val]
            idx = i
            el=Element(val,freq,idx)
            elements.append(el)
        
        sortedElements = sorted(elements, key=functools.cmp_to_key(self.customSortingComparator))
        for i in sortedElements:
            print(i.val, end=" ")
        
    def customSortingComparator(self, e1, e2):
        #print("E1: ",e1.val, e1.freq, e1.idx)
        #print("E2: ",e2.val, e2.freq, e2.idx)
        if(e1.freq!=e2.freq):
            return 1 if e1.freq<e2.freq else -1
        if(e1.idx!=e2.idx):
            return -1 if e1.idx<e2.idx else 1
        if(e1.val!=e2.val):
            return -1 if e1.val<e2.val else 1
        
            
        
    
    def findFrequencies(self, array):
        frequency={}
        for i in array:
            frequency[i] = frequency.get(i, 0)+1
    
        return frequency

sol=Solution()
sol.sortElements([2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8])

Output: 8 8 8 2 5 2 5 6 -1 9999999
Desired O/P: 8 8 8 2 2 5 5 6 -1 9999999 

我怀疑我的比较器逻辑有问题,有人可以帮我解决这个问题吗?

这里有一些限制条件:

  1. 无法使用 lambda 函数获取结果,
  2. 无法使用 pandas、numpy 等任何外部库来获取结果
  3. 这个练习严格需要使用需要在 sorted() 函数中传递的 functools.cmp_to_key 来执行。
integers, counts = np.unique(a, return_counts=True)
order = np.argsort(counts)[::-1]
result = pd.DataFrame({'integers':integers[order], 'counts':counts[order]})
display(result)

问题似乎是由按 idx 而不是按 val 排序引起的。

删除这个:

if(e1.idx!=e2.idx):
            return -1 if e1.idx<e2.idx else 1

考虑到这些限制,不确定为什么要把它放在那里。