请解释这段Python频率排序代码中sorted函数的逻辑,尤其是`-item[0]`的作用
列表元素按频率排序代码中sorted函数的工作逻辑解析
代码功能回顾
这段Python代码的核心是将输入列表按元素出现频率排序,最终返回一个新列表:先统计每个元素的出现次数,再基于频率排序元素,最后按重复次数生成结果列表。
完整代码
# code to print elements in a list on the basis of frequency they occurr class Solution: def frequencySort(self, nums: List[int]) -> List[int]: hashMap = {} res = [] # getting the frequency for i in nums: if i in hashMap: hashMap[i] = hashMap.get(i) + 1 else: hashMap[i] = 1 # sorting on the basis of value in dictionary hashMap = sorted(hashMap.items(), key=lambda item: (item[1], -item[0])) for k,v in hashMap: res.extend([k]*v) return res
sorted函数的工作逻辑
sorted(hashMap.items(), key=lambda item: (item[1], -item[0]))是排序的核心,拆解来看:
- 排序对象:
hashMap.items()返回字典的键值对元组集合,每个元组格式为(元素值, 出现频率),比如输入[1,2,2,3,3,3]会生成[(1,1), (2,2), (3,3)]。 - 排序规则:
key参数指定排序依据是二元组(item[1], -item[0]),sorted会按元组的优先级依次比较:- 第一优先级:
item[1](元素的出现频率),默认按升序排列,即出现次数少的元素排在前面,次数多的排在后面。 - 第二优先级:
-item[0](元素值的负数),当多个元素的出现频率相同时,触发这一级比较:
因为sorted是升序排序,数值更大的元素,它的负数值更小(比如元素5的负数是-5,元素3的负数是-3,-5 < -3),会被优先排列。最终效果是:频率相同的元素,数值大的排在更前面。
- 第一优先级:
举个例子:如果输入是[3,1,2,2,3,3,1],统计后哈希表是{3:3, 1:2, 2:2},排序时:
- 先按频率升序,
1和2频率都是2,排在3(频率3)前面; - 再比较
-item[0]:-2 < -1,所以2会排在1前面; - 最终排序后的元组列表是
[(2,2), (1,2), (3,3)],生成的结果列表就是[2,2,1,1,3,3,3]。
内容的提问来源于stack exchange,提问作者Vidhan Chitransh
相关产品推荐
相关产品推荐

