You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串格式日期下如何用归并排序实现CSV数据按日期排序

实现方案

现有代码的两处必改问题

  1. 递归终止条件错误:原代码if len(lista)<1仅在列表为空时返回,长度为1的列表会被持续切分导致递归逻辑错误,应改为长度小于等于1时直接返回原列表。
  2. 递归调用未接收返回值:原代码调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:48:31