Python中如何对长度不一或元素缺失的嵌套列表排序?
解决方案
要实现不修改原列表的排序,核心是为每个元素生成按sort序号顺序排列的数值元组作为排序键,利用Python元组的自然比较规则完成排序。
步骤说明
- 从子列表的每个项中提取sort序号(兼容"sort 1a"或"sort1c"这类带/不带空格的格式);
- 将每个元素的子列表按sort序号重新排序,提取对应的数值组成元组;
- 使用
sorted()函数(返回新列表,不修改原列表),以生成的元组作为排序键。
代码实现
import re def get_sort_number(sort_str): # 提取sort字符串中的数字部分,支持带/不带空格的格式 match = re.search(r"\d+", sort_str) return int(match.group()) if match else 0 def generate_sort_key(item): # 按sort序号对子列表排序,确保顺序是sort1、sort2... sorted_sub_items = sorted(item[2], key=lambda x: get_sort_number(x[0])) # 提取数值组成元组,作为排序的依据 return tuple(val for _, val in sorted_sub_items) # 你的原始列表(替换为实际数据即可) original_list = [ ("item A", "dataA", [("sort 1a", 0.37), ("sort 2a", 0.11)], "dataB", "dataC"), ( "item B", "dataA", [ ("sort 1b", 0.37), ("sort 2b", 0.66), ("sort 3b", 0.85), ("sort 4b", 0.63), ("sort 5b", 0.26), ], "dataB", "dataC", ), ( "item C", "dataA", [("sort1c", 0.37), ("sort 2c", 0.15), ("sort 3c", 0.60)], "dataB", "dataC", ), ( "item D", "dataA", [ ("sort 1d", 0.37), ("sort 2d", 0.66), ("sort 3d", 0.85), ("sort 4d", 0.63), ("sort 5d", 0.8), ], "dataB", "dataC", ), ] # 生成排序后的新列表,原列表完全不受影响 sorted_list = sorted(original_list, key=generate_sort_key) # 验证输出顺序 for item in sorted_list: print(item[0]) # 输出:item A → item C → item B → item D
原理说明
- 元组比较规则:Python会逐个对比元组中的元素,遇到第一个不同值时立即确定顺序;若前面元素全部相同,短元组会被视为更小,正好满足"没有后续sort项的元素排在前面"的需求。
sorted()函数返回全新列表,不会对原列表做任何修改,完全符合你的要求。
内容的提问来源于stack exchange,提问作者user19617032
相关产品推荐
相关产品推荐

