Python字典排序疑问:按嵌套字典pass_fail字段排序结果不符合预期的原因
问题排查与解决
错误原因
你写的sorted(some_dict, key=some_dict.get('pass_fail'), reverse=True)存在两处核心错误:
sorted直接遍历字典时,迭代的是字典的键(也就是'10_key0'、'10_key1'这类值),而非嵌套的内层字典。key参数要求传入可调用对象,你写的some_dict.get('pass_fail')是直接执行取值操作:外层some_dict根本不存在'pass_fail'这个顶级键,所以返回None,相当于没有指定自定义排序规则,sorted会默认按照键的字符串字典序排序,再加上reverse=True反转,最终得到你看到的['10_key1', '10_key0']的结果。
正确写法
key参数传入lambda函数,每次拿到迭代的键后,先取对应的内层字典,再提取pass_fail值做排序依据:
sorted(some_dict, key=lambda k: some_dict[k]['pass_fail'], reverse=True)
执行后得到预期输出:['10_key0', '10_key1']
相关知识点梳理
- 字典迭代规则:直接对字典做迭代/排序操作时,默认操作对象是字典的所有键,若要操作值或者键值对,需要显式调用
.values()或者.items()方法。 sorted的key参数规则:必须传入可调用对象(函数、lambda等),该对象接收当前迭代的单个元素作为输入,返回用于排序比较的实际值,不能直接传入静态值或者提前执行完的取值结果。- 嵌套字典取值:内层字典的键只能从对应内层字典上提取,不能直接在外层字典调用内层键名取值。
内容的提问来源于stack exchange,提问作者JohnJ
相关产品推荐
相关产品推荐

