Python中如何对键为元组的字典按值排序并获取对应键
Python元组键字典按值排序实现方法
不管字典的键是什么类型(包括元组),按值排序的核心逻辑都是指定排序维度为字典的值,结合Python版本特性保留排序顺序即可。
具体实现(Python 3.7+,原生字典保序)
Python 3.7及以上版本的原生字典默认保留键值对的插入顺序,直接对字典项排序后重构字典就能得到预期结果:
# 定义原始示例字典 origin_dict = {(1,1): 25, (1,2): 36, (1,3): 21, (2,1): 45, (2,2): 87, (2,3): 70} # 按值升序排序,生成新的有序字典 sorted_dict = dict(sorted(origin_dict.items(), key=lambda kv: kv[1]))
代码逻辑说明:
origin_dict.items()生成所有(键, 值)格式的元组序列,键为元组的特性不会干扰排序流程sorted()的key参数传入匿名函数,指定取每个键值对的第2个元素(也就是字典的值)作为排序依据,默认升序排序不需要额外参数- 外层
dict()将排序完成的键值对序列转为字典,自动保留排序后的顺序
运行后打印sorted_dict就能得到期望结果:
{(1, 3): 21, (1, 1): 25, (1, 2): 36, (2, 1): 45, (2, 3): 70, (2, 2): 87}
单独获取排序后对应的键
如果不需要保留完整字典,只需要拿到按值排序后的元组键列表,直接用列表推导式提取即可:
sorted_keys = [kv[0] for kv in sorted(origin_dict.items(), key=lambda x: x[1])]
运行后sorted_keys的结果为:
[(1, 3), (1, 1), (1, 2), (2, 1), (2, 3), (2, 2)]
低版本Python兼容方案(3.7以下)
Python 3.7之前的原生字典不保留插入顺序,如果需要固定排序后的键值映射关系,可以用标准库的OrderedDict存储结果:
from collections import OrderedDict sorted_dict = OrderedDict(sorted(origin_dict.items(), key=lambda kv: kv[1]))
内容的提问来源于stack exchange,提问作者Azadeh Farsi
相关产品推荐
相关产品推荐

