You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:25:48