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

Python中Assignment类按截止日期排序失效问题求助

问题原因

你直接对日期字符串使用.sort()没生效,核心问题是字符串是按字典序比较的,不是实际的日期顺序。比如字符串"10/01/2020"会被判定为比"09/30/2020"大(因为首字符"1" > "0"),这和真实的日期先后逻辑完全不符。

两种解决方案

方案一:临时转换日期后排序(不修改原存储结构)

在display_assignment_by_due_date方法里,把每个作业的日期字符串转成datetime对象,以此作为排序依据,排序后再输出:

from datetime import datetime

# 保留原有类结构,仅修改display_assignment_by_due_date方法
def display_assignment_by_due_date(self):
    print("Display assignments by due dates.")
    # 用lambda表达式指定排序key:将日期字符串转为datetime对象
    sorted_assignments = sorted(self.assignments, key=lambda x: datetime.strptime(x[0], "%m/%d/%Y"))
    for assignment in sorted_assignments:
        print('Due Date: ' + assignment[0] + ', Assignment: ' + assignment[1])

方案二:存储时直接用datetime对象(更推荐)

如果在添加作业时就把日期字符串转成datetime对象存储,后续排序、比较都会更准确,还能提前校验日期格式:

from datetime import datetime

class Assignment:
    def __init__(self):
        self.assignments = []

    def add(self, due_date_str, course):
        # 转换日期格式并校验合法性
        try:
            due_date = datetime.strptime(due_date_str, "%m/%d/%Y")
        except ValueError:
            print("日期格式错误,请输入MM/DD/YYYY格式")
            return
        add_course = [due_date, course]
        if add_course not in self.assignments:
            self.assignments.append(add_course)
    
    def remove(self, due_date_str, course):
        try:
            due_date = datetime.strptime(due_date_str, "%m/%d/%Y")
        except ValueError:
            print("日期格式错误,请输入MM/DD/YYYY格式")
            return
        remove_course = [due_date, course]
        if remove_course in self.assignments: 
            self.assignments.remove(remove_course)

    def display_assignment(self):
        print("Display assignments by order they are entered.")
        for assignment in self.assignments:
            # 输出时转回字符串格式
            print('Due Date: ' + assignment[0].strftime("%m/%d/%Y") + ', Assignment: ' + assignment[1])

    def display_assignment_by_due_date(self):
        print("Display assignments by due dates.")
        # datetime对象可直接按日期逻辑排序
        sorted_assignments = sorted(self.assignments, key=lambda x: x[0])
        for assignment in sorted_assignments:
            print('Due Date: ' + assignment[0].strftime("%m/%d/%Y") + ', Assignment: ' + assignment[1])
补充说明
  • 方案一适合快速修复,无需改动原有存储逻辑,但每次排序都要转换日期,性能略低;
  • 方案二更规范,datetime对象的比较是原生的日期逻辑,不会出现排序错误,还能提前拦截无效日期输入;
  • 你之前直接用self.assignments.sort()无效,本质就是因为字符串排序的逻辑不符合日期规则,必须指定基于日期的排序key。

内容的提问来源于stack exchange,提问作者1TimeCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:25:24