如何基于组内首行第四列日期排序CSV分组列表?
问题:按组首行日期排序并合并CSV分组数据
需求说明
- 处理CSV文件,将地址相同的行划分为1-10行的组
- 按每个组首行第四列的日期对组进行排序,再合并所有组得到目标列表
- 每组内部已按日期正确排序
数据伪示例
原分组数据:
list_of_parcel_groups = [ [ [0,1,2,"11/22/2022"], [0,1,2,"01/01/2001"] ], [ [0,1,2,"3/11/2022"], [0,1,2,"3/4/2016"], [0,1,2,"5/18/2011"], [0,1,2,"03/13/2009"] ], [ [0,1,2,"5/13/2019"], [0,1,2,"4/20/2018"], [0,1,2,"7/13/1999"] ] ]
预期合并排序后的结果:
qualified = [ [0,1,2,"5/13/2019"], [0,1,2,"4/20/2018"], [0,1,2,"7/13/1999"], [0,1,2,"3/11/2022"], [0,1,2,"3/4/2016"], [0,1,2,"5/18/2011"], [0,1,2,"03/13/2009"], [0,1,2,"11/22/2022"], [0,1,2,"01/01/2001"] ]
排序依据是各组首行的日期:
list_of_parcel_groups[0][0][3](11/22/2022)list_of_parcel_groups[1][0][3](3/11/2022)list_of_parcel_groups[2][0][3](5/13/2019)
当前尝试的代码
import datetime qualified = [] list_of_parcel_groups = [ [ [0,1,2,"11/22/2022"], [0,1,2,"01/01/2001"] ], [ [0,1,2,"3/11/2022"], [0,1,2,"3/4/2016"], [0,1,2,"5/18/2011"], [0,1,2,"03/13/2009"] ], [ [0,1,2,"5/13/2019"], [0,1,2,"4/20/2018"], [0,1,2,"7/13/1999"] ] ] for i in range(len(list_of_parcel_groups)): if i == 0: string_input_with_date = list_of_parcel_groups[i][0][3] date = datetime.strptime(string_input_with_date, "%m/%d/%Y") for item in list_of_parcel_groups[i]: qualified.append(item) continue string_input_with_date1 = list_of_parcel_groups[i][0][3] date1 = datetime.strptime(string_input_with_date1, "%m/%d/%Y") if (date1.date() <= date.date()): list_of_parcel_groups[i].reverse() for item in list_of_parcel_groups[i]: qualified.insert(0,item) list_of_parcel_groups[i].reverse() date = datetime.strptime(list_of_parcel_groups[i][0][3], "%m/%d/%Y") continue if (date1.date() > date.date()): for item in list_of_parcel_groups[i]: qualified.append(item) date = datetime.strptime(list_of_parcel_groups[i][0][3], "%m/%d/%Y")
问题点
逐个比较组并插入头部/尾部的逻辑无法实现全局排序,因为新组可能需要插入到列表中间位置,而非仅头部或尾部,导致最终结果不符合预期。(注:每组内部已按日期正确排序,插入时反转组是为了保持原组结构,后续仍能通过list_of_parcel_groups[i][0][3]获取日期)
解决方案
正确的做法是先对所有组按首行日期完成全局排序,再依次合并各组:
import datetime list_of_parcel_groups = [ [ [0,1,2,"11/22/2022"], [0,1,2,"01/01/2001"] ], [ [0,1,2,"3/11/2022"], [0,1,2,"3/4/2016"], [0,1,2,"5/18/2011"], [0,1,2,"03/13/2009"] ], [ [0,1,2,"5/13/2019"], [0,1,2,"4/20/2018"], [0,1,2,"7/13/1999"] ] ] # 按组首行第四列的日期降序排序各组 sorted_groups = sorted( list_of_parcel_groups, key=lambda group: datetime.datetime.strptime(group[0][3], "%m/%d/%Y"), reverse=True ) # 合并所有组到qualified列表 qualified = [] for group in sorted_groups: qualified.extend(group) # 验证结果 print(qualified)
逻辑说明
- 全局排序:使用
sorted()函数,通过key参数指定按每组首行的日期转换为datetime对象进行排序,reverse=True实现降序,匹配预期结果的顺序 - 合并组:直接用
extend()将每组的所有元素追加到结果列表,因每组内部已完成正确排序,无需额外处理 - 优势:代码简洁,避免逐个插入的逻辑错误,确保全局排序准确
内容的提问来源于stack exchange,提问作者Henry Mangelsdorf
相关产品推荐
相关产品推荐

