排序功能的自定义键不起作用

时间:2019-08-31 06:16:01

标签: python python-3.x

给定一个整数数组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。 (我第二次调用排序似乎无效)

2 个答案:

答案 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'))