如何从嵌套列表中查找按长度排序的第k大子列表(同长度取后出现项)
实现方案
核心逻辑
你遇到的问题本质是:第k大指的是长度的排名为第k,相同长度的子列表需要取原列表中出现位置最靠后的项,因此不能直接对排序后的列表取倒序索引。
实现步骤
- 按子列表长度对原列表分组,同长度的子列表在组内保留原列表的出现顺序
- 将所有分组按长度从大到小排序,得到长度的排名序列
- 取排名第k位对应分组的最后一个元素,即为目标结果
代码实现
from collections import defaultdict original_list = [[1, 2, 3, 4], [1, 9, 12], [9], [8], [7, 8, 9, 10, 12, 16], [7, 8, 9, 10], [4, 5, 6, 7], [6, 7, 8, 9, 10, 11]] # 按长度分组,同长度保留原顺序 length_groups = defaultdict(list) for sub in original_list: length_groups[len(sub)].append(sub) # 按长度降序排列分组 sorted_groups = sorted(length_groups.items(), key=lambda x: -x[0]) def get_kth_largest(k): # 取第k大对应的分组,返回组内最后一个(原顺序最靠后的)元素 return sorted_groups[k-1][1][-1] # 测试 print(get_kth_largest(1)) # 输出 [6, 7, 8, 9, 10, 11] print(get_kth_largest(2)) # 输出 [4, 5, 6, 7]
基于现有sorted_list的实现
如果你要基于已经生成的sorted_list做处理,逻辑完全一致:
sorted_list = [[9], [8], [1, 9, 12], [1, 2, 3, 4], [7, 8, 9, 10], [4, 5, 6, 7], [7, 8, 9, 10, 12, 16], [6, 7, 8, 9, 10, 11]] length_groups = defaultdict(list) for sub in sorted_list: length_groups[len(sub)].append(sub) sorted_groups = sorted(length_groups.items(), key=lambda x: -x[0]) def get_kth_largest(k): return sorted_groups[k-1][1][-1]
内容的提问来源于stack exchange,提问作者Shar_pra
相关产品推荐
相关产品推荐

