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
相关产品推荐
相关产品推荐

