按元素的频率排序python列表

时间:2016-08-08 04:34:22

标签: python list sorting

我有这个代码,它按元素的频率对python列表进行排序。它适用于所有其他情况,除非两个元素的频率相同。如果频率相同,那么我想在较高值之前先放置较小的值:

counts = collections.Counter(arr)
new_list = sorted(arr, key=lambda x: counts[x])

for item in new_list:
    print item

如果[3,1,2,2,4]输出应为[1,3,4,2,2],但我得[3,1,4,2,2]。如何解决此错误?

2 个答案:

答案 0 :(得分:2)

您可以将键值lambda函数设置为元组,因此,它将首先按counts[x]排序,如果存在平局,它将按x排序,值本身。

 new_list = sorted(arr, key=lambda x: (counts[x], x))

答案 1 :(得分:1)

您只按项目数排序。根据这个逻辑,出现一次的所有项目都具有相同的" weight",因此python保留其原始相关位置。例如,31都出现一次,因此就它们的排序而言,它们是等价的。由于3位于原始列表中1之前,因此它也位于结果的第一位。

您需要的输出调用辅助排序条件 - 元素的值。为此,您必须明确指定:

new_list = sorted(arr, key=lambda x: (counts[x], x))