Python字典排序求助:先按值降序再按键降序实现异常
字典按值降序、值相同按键降序的正确实现
你的需求很明确:对键为门牌号、值为瓶颈数的字典,先按值降序排序,值相同时按键降序排序。原代码的问题在于完全搞错了键的处理逻辑,用值的索引替代了原门牌号键,自然会出现不存在的0和丢失正确键的情况。
错误原因分析
原代码里的sort_final = {first_val.index(i):i ...}是核心问题:first_val.index(i)返回的是值i在first_val列表中的第一个位置索引,这和原字典的门牌号键没有任何关系,直接把索引当键用,当然会得到错误的结果。而且这个逻辑还会丢失多个相同值对应的不同键(比如值1对应的5和2,只会保留第一个索引)。
正确实现方式
Python里可以直接用sorted()函数对字典的items()进行排序,通过自定义key参数实现你的排序规则:
- 要按值降序,就把值取负数作为排序键的第一个元素(因为
sorted默认升序,负数升序等价于原数降序) - 值相同时按键降序,同样把键取负数作为排序键的第二个元素
代码示例:
dictionary = {3:5, 2:1, 5:1, 4:6} # 对字典的键值对进行排序,key是(-值, -键) sorted_items = sorted(dictionary.items(), key=lambda x: (-x[1], -x[0])) # 把排序后的列表转成字典(Python 3.7+字典会保留插入顺序) sort_final = dict(sorted_items) print(sort_final) # 输出: {4: 6, 3: 5, 5: 1, 2: 1}
代码解释
dictionary.items()会返回字典的键值对元组列表,比如[(3,5), (2,1), (5,1), (4,6)]sorted(..., key=lambda x: (-x[1], -x[0])):x[1]是值,取负后,大的值会排在前面(降序)x[0]是键,当值相同时,取负后的键大的排在前面(原键降序)
dict(sorted_items)把排序后的元组列表转回字典,Python 3.7及以上版本的字典会严格保留元素的插入顺序,所以结果就是你要的排序后的字典。
内容的提问来源于stack exchange,提问作者noel76
相关产品推荐
相关产品推荐

