Python:如何按值排序字典(处理值相等的情况)
我来帮你补全这个排序函数,同时拆解每一步的逻辑~
完整实现(补全你的快排框架)
def ordenar(dic): # 用内置方法直接把字典转成键值对元组列表,替代你原来的zip逻辑 list_3 = list(dic.items()) def partition(l): # 选取最后一个元素的值作为排序基准 pivot_val = l[-1][1] piv_item = l[-1] less_eq = [] greater = [] # 遍历除基准外的所有元素,按值划分 for item in l[:-1]: if item[1] <= pivot_val: less_eq.append(item) else: greater.append(item) return (less_eq, piv_item, greater) def quicksort(l): if len(l) <= 1: return l else: less_eq, piv, greater = partition(l) less_eq = quicksort(less_eq) greater = quicksort(greater) # 补全你未完成的拼接步骤 return less_eq + [piv] + greater # 对键值对列表排序后转回字典(Python3.7+字典保留插入顺序) sorted_items = quicksort(list_3) return dict(sorted_items) # 测试验证 d = {3: '__init__', 5: 'other', 7: 'hey', 11: 'hey'} print(ordenar(d)) # 输出: {3: '__init__', 7: 'hey', 11: 'hey', 5: 'other'}
关键逻辑说明
- 简化键值对转换:用
list(dic.items())替代手动zip键和值的操作,这是Python处理字典键值对的标准方式,更简洁高效。 - 按值分区:
partition函数以元素的值(元组第二个元素item[1])为基准,把列表分成「值≤基准」「基准本身」「值>基准」三部分,满足按值排序的需求。 - 快排拼接:递归排序完左右分区后,将三部分按顺序拼接,得到有序的键值对列表,最后转成字典即可保留排序后的顺序。
更简洁的替代方案(用Python内置函数)
如果你不想手动实现快排,Python的sorted函数可以一行搞定:
d = {3: '__init__', 5: 'other', 7: 'hey', 11: 'hey'} sorted_d = dict(sorted(d.items(), key=lambda x: x[1])) print(sorted_d) # 同样得到期望输出
这里key=lambda x: x[1]明确指定按字典的值排序,sorted默认升序排列,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

