如何合并嵌套列表中起始日期相同的子列表并保留最优条目
解决嵌套列表按起始日期合并并保留最晚结束日期条目的方案
这是个很常见的分组筛选需求,咱们用Python就能轻松实现,核心思路就是按起始日期分组,然后在每个组里保留结束日期最晚的那条记录。下面给两种实用的实现方法:
方法一:用字典分组(高效遍历,无需排序)
这种方法只需要遍历一次原列表,时间复杂度是O(n),适合处理较大的数据集:
myList = [[20, 'Start', '2008-10-10', 'End', '2008-11-09', 'NG'], [21, 'Start', '2008-10-10', 'End', '2008-12-15', 'G'], [22, 'Start', '2009-11-23', 'End', '2009-12-10', 'B']] # 用字典按起始日期分组,键是起始日期,值存当前组最晚结束的条目 grouped_dict = {} for item in myList: start_date = item[2] # 起始日期在子列表的第3个位置(索引2) end_date = item[4] # 结束日期在子列表的第5个位置(索引4) if start_date not in grouped_dict: # 该起始日期首次出现,直接存入字典 grouped_dict[start_date] = item else: # 对比当前条目和字典中已有条目的结束日期,保留更晚的 if end_date > grouped_dict[start_date][4]: grouped_dict[start_date] = item # 把字典的值转换成列表就是最终结果 final_list = list(grouped_dict.values()) print(final_list)
关键说明:
这里咱们直接用字符串格式的日期比较大小是可行的,因为YYYY-MM-DD的字符串排序逻辑和实际日期的先后顺序完全一致,不用额外转换为datetime对象,省了不少步骤。
方法二:用itertools.groupby分组(适合熟悉迭代工具的场景)
如果习惯用Python的迭代工具库,也可以用groupby来实现,但要注意**groupby要求先对分组键排序**,所以步骤会多一步排序:
from itertools import groupby myList = [[20, 'Start', '2008-10-10', 'End', '2008-11-09', 'NG'], [21, 'Start', '2008-10-10', 'End', '2008-12-15', 'G'], [22, 'Start', '2009-11-23', 'End', '2009-12-10', 'B']] # 先按起始日期对列表排序,确保相同起始日期的条目挨在一起 sorted_list = sorted(myList, key=lambda x: x[2]) final_list = [] # 按起始日期分组,然后在每个组里取结束日期最大的条目 for start_date, group_items in groupby(sorted_list, key=lambda x: x[2]): max_item = max(group_items, key=lambda x: x[4]) final_list.append(max_item) print(final_list)
两种方法对比:
- 方法一无需排序,遍历一次即可完成,效率更高;
- 方法二代码更简洁,但因为需要排序,时间复杂度是O(n log n),适合中小规模的列表。
两种方法运行后都会得到你想要的结果:
[[21, 'Start', '2008-10-10', 'End', '2008-12-15', 'G'], [22, 'Start', '2009-11-23', 'End', '2009-12-10', 'B']]
内容的提问来源于stack exchange,提问作者user9831231
相关产品推荐
相关产品推荐

