如何对defaultdict(list)的列表值排序?澄清排序结果的误解
问题解答
你的代码本身已经正确实现了按元组的第2、3个元素倒序排序的需求,下面拆解验证逻辑:
代码逻辑验证
先看你提供的完整代码:
from collections import defaultdict d=defaultdict(list) d['A']=[('a',20,30), ('b', 13, 1)] d['B']=[('c',2,1), ('b', 3, 21)] for k, v in d.items(): d[k] = sorted(v, key=lambda tup: (tup[1], tup[2]), reverse=True) print(d)
对'A'组的排序验证
'A'组的两个元组是('a',20,30)和('b',13,1):
- 优先比较元组第2个元素:20 > 13,因此
('a',20,30)自然排在前面,和输出结果一致 - 只有当第2个元素相同时,才会继续比较第3个元素倒序,这里无需触发这一步
对'B'组的排序验证
'B'组的两个元组是('c',2,1)和('b',3,21):
- 第2个元素3 > 2,所以
('b',3,21)排在前面,和输出结果一致
你最初误以为结果应该是('a',30,20),是混淆了排序依据和修改元组元素顺序——你的代码是基于元组第2、3位的数值大小来排序,而非交换这两个位置的元素,所以原有代码的输出完全符合需求。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

