如何对5个格式为‘january 1’的输入日期按时间顺序排序?
解决日期排序问题:同时处理月份与日期排序
你的代码目前只实现了月份的提取排序,但没有将月份和对应的日期绑定,导致排序后月份与原日期脱节,而且完全无法处理同月份内的日期排序。另外代码重复冗余,每个生日都单独写判断逻辑,既低效又容易出错。
改进思路
把每个输入的生日转换成(月份数字, 日期数字)的元组——Python中元组会按元素顺序自动排序:先比较第一个元素(月份),月份相同时再比较第二个元素(日期)。将所有生日元组存入列表后直接排序,就能实现完整的时间顺序排序。
优化后的代码
# 定义月份列表,索引对应月份数字(索引0=1月,+1即实际月份) months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'] birthdays = [] # 循环接收5个输入,避免重复代码 for i in range(5): date_input = input(f'birthday {i+1}: ') month_name, day_str = date_input.split() # 转换月份为数字、日期为整数 month_num = months.index(month_name) day_num = int(day_str) # 存入元组(月份数字, 日期数字, 原输入),方便后续输出 birthdays.append( (month_num, day_num, date_input) ) # 对列表排序:先按月份,再按日期 birthdays.sort() # 输出排序结果 print("排序后的生日:") for idx, (month_num, day_num, original) in enumerate(birthdays, 1): # 两种输出方式可选:显示数字月份+日期,或原格式 print(f"{idx}. 月份: {month_num+1}, 日期: {day_num}") # print(f"{idx}. {original}") # 直接输出原输入格式,比如"january 1"
核心逻辑说明
- 循环接收输入:用for循环替代重复的5次input,代码更简洁易维护。
- 绑定月份与日期:将每个生日的月份数字、日期数字打包成元组,排序时元组会自动遵循「先月后日」的规则。
- 排序后输出:遍历排序后的列表,直接得到时间顺序的结果,不会出现月份与日期不匹配的问题。
测试示例
如果输入:
birthday 1: march 15 birthday 2: january 20 birthday 3: march 5 birthday 4: february 28 birthday 5: january 10
排序后输出:
排序后的生日: 1. 月份: 1, 日期: 10 2. 月份: 1, 日期: 20 3. 月份: 2, 日期: 28 4. 月份: 3, 日期: 5 5. 月份: 3, 日期: 15
内容的提问来源于stack exchange,提问作者BryceD3
相关产品推荐
相关产品推荐

