给定一个整数数组A [],必须根据元素的频率对A进行排序。如果两个元素的频率相同,则数量较少。
我尝试使用以下代码通过sort函数解决问题,但我的sort()自定义键似乎无法正常工作。有人可以告诉我这是怎么回事吗?
'''a is the input array and n is it's sizeQ'''
def sortByFreq(a,n):
def count(k):
return n-a.count(k)
a.sort(key=int)
a.sort(key=count)
a=list(map(str,a))
answer=' '.join(a)
print(answer)
对于输入数组[9,9,9,2,5],该代码应该打印9 9 9 2 5(因为该数组已经存在),但是它将打印2 5 9 9 9。 (我第二次调用排序似乎无效)
答案 0 :(得分:1)
问题在于您无法使用sort
键内的原始列表,因为sort
使用了不适当的位置来计算排序。
在某些时候,原始a
为空。调用排序键时,不要期望“ a
的所有元素都在其中”。
实际上,如果您使用a
方法打印count
,则每次都会得到一个空列表。
解决方法是制作列表的副本并在排序键中使用它(此外:无需传递列表的大小,因为len
可以计算出来)
def sortByFreq(a):
def count(k):
return len(a_copy)-a_copy.count(k)
a_copy = a.copy() # create a copy of the list
a.sort(key=count)
a=list(map(str,a))
answer=' '.join(a)
print(answer)
一种替代方法是使用计数器对元素进行预计数(使用哈希,因此速度更快)。请注意,您还必须存储a
的长度。
def sortByFreq(a):
def count(k):
return n-c[k]
c = collections.Counter(a)
n = len(a)
a.sort(key=count)
最后,一种较短的方法是使用reverse=True
简化排序键,我们可以将其转换为lambda
:
def sortByFreq(a):
c = collections.Counter(a)
a.sort(key=lambda k:c[k],reverse=True)
答案 1 :(得分:0)
def sort_by_frequency(sequence):
"""Sort sequence by frequency."""
return ''.join(sorted([char for char in sequence], key=sequence.count, reverse=True))
if __name__ == '__main__':
print(sort_by_frequency('92959'))