我有这个代码,它按元素的频率对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]
。如何解决此错误?
答案 0 :(得分:2)
您可以将键值lambda函数设置为元组,因此,它将首先按counts[x]
排序,如果存在平局,它将按x
排序,值本身。
new_list = sorted(arr, key=lambda x: (counts[x], x))
答案 1 :(得分:1)
您只按项目数排序。根据这个逻辑,出现一次的所有项目都具有相同的" weight",因此python保留其原始相关位置。例如,3
和1
都出现一次,因此就它们的排序而言,它们是等价的。由于3
位于原始列表中1
之前,因此它也位于结果的第一位。
您需要的输出调用辅助排序条件 - 元素的值。为此,您必须明确指定:
new_list = sorted(arr, key=lambda x: (counts[x], x))