字符串格式日期下如何用归并排序实现CSV数据按日期排序
实现方案
现有代码的两处必改问题
- 递归终止条件错误:原代码
if len(lista)<1仅在列表为空时返回,长度为1的列表会被持续切分导致递归逻辑错误,应改为长度小于等于1时直接返回原列表。 - 递归调用未接收返回值:原代码调用
merge_sort(left)、merge_sort(right)后没有将排序后的子列表重新赋值,merge阶段拿到的始终是未排序的原始切片,排序完全不生效。
日期比较逻辑
你使用的YYYY-MM-DD格式日期为ISO标准格式,年、月、日按高位到低位排列,且月、日均补零为两位,无需转成距基准日的天数,也无需datetime模块:直接按-拆分字符串得到年、月、日三段,转成整数后按年→月→日的优先级比较即可,逻辑和你设想的多级排序完全一致,不需要额外创建多份字典或列表存储中间值。
数据预处理
原始数据为键是条目ID的字典,字典本身不支持直接按值排序,先将其转换为列表,每个元素保留原ID、名称、日期字段,避免排序后丢失原始ID映射:
# 原始数据(补全原代码缺失的字典逗号分隔符) raw_data = { 10: {"Name": "Potato", "Date": "2005-12-03"}, 20: {"Name": "Tomato", "Date": "2002-03-13"}, 30: {"Name": "Banana", "Date": "2003-04-15"}, 40: {"Name": "Orange", "Date": "2004-01-22"} } # 转换为待排序列表 sort_list = [ {"id": item_id, "Name": info["Name"], "Date": info["Date"]} for item_id, info in raw_data.items() ]
修改后的归并排序实现
def date_less_than(date_a, date_b): # 逐段比较两个YYYY-MM-DD格式日期的先后,返回date_a是否早于date_b y1, m1, d1 = map(int, date_a.split('-')) y2, m2, d2 = map(int, date_b.split('-')) if y1 != y2: return y1 < y2 if m1 != m2: return m1 < m2 return d1 < d2 def merge(left, right): res = [] p1 = p2 = 0 while p1 < len(left) and p2 < len(right): # 仅比较两个条目的Date字段,保留整条记录 if date_less_than(left[p1]["Date"], right[p2]["Date"]): res.append(left[p1]) p1 += 1 else: res.append(right[p2]) p2 += 1 # 追加剩余未遍历元素 res.extend(left[p1:]) res.extend(right[p2:]) return res def merge_sort(lista): if len(lista) <= 1: return lista mid = len(lista) // 2 # 递归排序左右子列表后接收返回值 left_sorted = merge_sort(lista[:mid]) right_sorted = merge_sort(lista[mid:]) return merge(left_sorted, right_sorted)
调用方式
直接将预处理好的列表传入merge_sort即可,返回值就是按日期升序排列的完整条目列表:
sorted_res = merge_sort(sort_list)
执行后输出顺序为:
{'id': 20, 'Name': 'Tomato', 'Date': '2002-03-13'} {'id': 30, 'Name': 'Banana', 'Date': '2003-04-15'} {'id': 40, 'Name': 'Orange', 'Date': '2004-01-22'} {'id': 10, 'Name': 'Potato', 'Date': '2005-12-03'}
补充说明
- 如果确认所有日期字符串都是严格补零的
YYYY-MM-DD格式,甚至可以不用拆分转整数,直接用<比较两个日期字符串,结果和逐段比较完全一致,因为数字字符的ASCII顺序和数值顺序匹配。 - 整个实现未使用datetime模块和内置sorted函数,所有排序逻辑基于你提供的归并排序框架修改,没有额外创建冗余的中间字典结构。
内容的提问来源于stack exchange,提问作者Wanga Manga
相关产品推荐
相关产品推荐

