如何用更Pythonic/列表推导式方式从指定字典生成有序键列表?
更Pythonic的实现方案
针对你的需求——基于值(唯一且范围为0到len(my_dict)-1)生成从小到大排序的键列表,这里提供两种更简洁高效的实现方式:
方法1:利用值作为索引直接构建列表
因为值刚好覆盖了从0到字典长度减1的所有整数,我们可以直接用值作为索引来定位键的位置,时间复杂度为O(n),效率远高于原嵌套循环:
my_dict = {"foo": 1, "bar": 0, "more": 2} my_list = [None] * len(my_dict) for key, idx in my_dict.items(): my_list[idx] = key # 结果:['bar', 'foo', 'more'](按值从小到大排序的键列表)
方法2:列表推导式结合排序
如果偏好列表推导式的写法,可以借助sorted()函数按值排序后提取键,代码简洁可读性强:
my_dict = {"foo": 1, "bar": 0, "more": 2} my_list = [key for key, idx in sorted(my_dict.items(), key=lambda x: x[1])] # 结果:['bar', 'foo', 'more']
如果实际需求是按值从大到小排序(对应原代码末尾的reverse()操作),只需给sorted()添加reverse=True参数:
my_list = [key for key, idx in sorted(my_dict.items(), key=lambda x: x[1], reverse=True)] # 结果:['more', 'foo', 'bar']
对比原实现
原代码通过嵌套循环遍历字典找对应值的键,时间复杂度为O(n²),当字典规模较大时效率会明显下降。上面两种方法要么是线性时间复杂度,要么是O(n log n)的排序时间,同时代码风格更符合Python的简洁特性。
内容的提问来源于stack exchange,提问作者md_rasler
相关产品推荐
相关产品推荐

