如何基于首个列表列表的排序规则同步排序多个Python列表列表?
按基准嵌套列表同步排序多组嵌套列表的Python实现
问题背景
现有多组结构一致的嵌套列表,示例如下:
days = [[5,2,7],[5,2]] km = [[2,3,4],[4,3]] time = [[30,10,20],[15,25]]
需要以days中每个子列表的排序规则为基准,同步对km、time(及其他约10个同结构列表)的对应子列表排序,预期输出:
days = [[2,5,7],[2,5]] km = [[3,2,4],[3,4]] time = [[10,30,20],[25,15]]
单独对每个列表使用list(map(sorted, days))无法实现同步排序,需批量完成同步操作。
解决方案
核心逻辑是基于基准列表子列表的排序索引,重排所有对应子列表的元素,通过zip打包对应子列表、生成排序索引、按索引重排三个步骤实现:
实现代码
# 原始数据 days = [[5,2,7],[5,2]] km = [[2,3,4],[4,3]] time = [[30,10,20],[15,25]] def sync_sort(base_list, *other_lists): sorted_groups = [] # 遍历每一组对应位置的子列表 for base_sub, *others_sub in zip(base_list, *other_lists): # 生成基准子列表排序后的索引顺序 sorted_indices = sorted(range(len(base_sub)), key=lambda idx: base_sub[idx]) # 按索引顺序重排当前组的所有子列表 sorted_base = [base_sub[idx] for idx in sorted_indices] sorted_others = [[sub[idx] for idx in sorted_indices] for sub in others_sub] sorted_groups.append((sorted_base, *sorted_others)) # 将排序后的组拆分回独立列表 sorted_results = tuple(map(list, zip(*sorted_groups))) return sorted_results # 执行同步排序 sorted_days, sorted_km, sorted_time = sync_sort(days, km, time) # 输出结果 print("days =", sorted_days) print("km =", sorted_km) print("time =", sorted_time)
关键步骤说明
- 打包子列表组:
zip(base_list, *other_lists)将所有列表中同一位置的子列表打包成元组,比如第一组为([5,2,7], [2,3,4], [30,10,20])。 - 生成排序索引:
sorted(range(len(base_sub)), key=lambda idx: base_sub[idx])得到基准子列表排序后的元素索引,比如对[5,2,7],索引顺序为[1,0,2](对应元素2、5、7)。 - 按索引重排:通过列表推导式,用上述索引重新排列当前组内所有子列表的元素,保证排序规则和基准子列表完全一致。
- 拆分结果:
zip(*sorted_groups)将排序后的子列表组拆分回独立的嵌套列表,最后转换为列表类型(map(list, ...)解决zip返回元组的问题)。
适配多列表场景
如果有10个同结构列表,只需将所有列表作为参数传入sync_sort即可:
# 假设列表为list1, list2, ..., list10 sorted_list1, sorted_list2, ..., sorted_list10 = sync_sort(list1, list2, list3, ..., list10)
内容的提问来源于stack exchange,提问作者ohh
相关产品推荐
相关产品推荐

