如何使用 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
我怀疑我的比较器逻辑有问题,有人可以帮我解决这个问题吗?
这里有一些限制条件:
- 无法使用 lambda 函数获取结果,
- 无法使用 pandas、numpy 等任何外部库来获取结果
- 这个练习严格需要使用需要在 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
考虑到这些限制,不确定为什么要把它放在那里。
我编写了一个程序,可以根据元素出现的频率对给定的整数列表进行排序。那就是频率较高的元素排在第一位。如果两个元素的频率相同,则较小的数字在前。
但是我的代码没有正确打印输出
我使用了比较器并导入了 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
我怀疑我的比较器逻辑有问题,有人可以帮我解决这个问题吗?
这里有一些限制条件:
- 无法使用 lambda 函数获取结果,
- 无法使用 pandas、numpy 等任何外部库来获取结果
- 这个练习严格需要使用需要在 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
考虑到这些限制,不确定为什么要把它放在那里。