按元组指定元素对含元组键的字典列表排序
按字典键元组的第二个元素排序字典列表
嘿,我来帮你搞定这个排序问题!你的需求很明确:给一个由单键字典组成的列表排序,排序依据是每个字典键(元组)的第二个元素。之前的lambda写法出错是因为没正确处理字典的键提取,下面一步步给你讲清楚。
正确实现代码
先看你的示例输入:
input_list = [{(5,9): "item"}, {(0,4): "item"}]
要实现预期排序,正确的sort写法是:
# 原地排序(直接修改原列表) input_list.sort(key=lambda d: next(iter(d))[1]) # 如果不想修改原列表,用sorted返回新列表 sorted_list = sorted(input_list, key=lambda d: next(iter(d))[1])
执行后就能得到你想要的结果:[{(0,4): "item"}, {(5,9): "item"}]
原理拆解
咱们一步步拆解lambda表达式里的逻辑:
lambda d:这里的d代表列表中的每一个字典元素,比如第一个{(5,9): "item"}就是一个d。next(iter(d)):因为每个字典只有一个键,直接迭代字典等价于迭代它的键集合。iter(d)把键转成迭代器,next()取出迭代器的第一个(也是唯一一个)元素,也就是那个元组键,比如(5,9)或(0,4)。[1]:取元组的第二个元素(Python索引从0开始),也就是9或4,这个值就是排序的依据——sort方法会根据这些值的大小给原列表排序。
替代写法(更直观但稍逊高效)
如果你觉得next(iter(d))有点抽象,也可以用更直白的方式提取键:
input_list.sort(key=lambda d: list(d.keys())[0][1])
list(d.keys())会把字典的键转成列表,[0]取第一个(唯一的)键,再[1]取元组的第二个元素。不过这种方法会生成一个临时列表,效率不如next(iter(d))高,但对于小列表来说差别可以忽略。
为什么你之前的写法不对?
你尝试的key= lambda k[[1]]有两个问题:
- lambda表达式需要定义参数(比如
k),然后返回一个值,你没写参数的正确用法; - 没有先从字典中提取出元组键,直接对字典用
[[1]]是语法错误,因为字典不能用双层索引直接取值。
内容的提问来源于stack exchange,提问作者mg175430
相关产品推荐
相关产品推荐

