‘set’对象不可下标访问错误解析及代码修复方案
问题分析与解决
错误原因:'set' is not subscriptable
你把months定义成了集合(set),集合是无序的元素集合,只能判断元素是否存在,根本没法用集合[元素]这种下标方式取值。而你需要的是“月份名称→对应数字”的映射关系,这得用字典(dict)——字典是键值对结构,能通过键(月份名)直接拿到对应的值(数字)。
另外你的months定义还有一堆语法错误:
- 键和值之间缺冒号(应该是
"January": "1",不是"January", "1") - 多个键值对之间缺逗号(比如
"January": "1"后面没加逗号) "December""12"少了冒号和逗号,得改成"December": "12"
修正后的完整代码
# 定义月份名称到数字的映射字典 months = { "January": "1", "February": "2", "March": "3", "April": "4", "May": "5", "June": "6", "July": "7", "August": "8", "September": "9", "October": "10", "November": "11", "December": "12" } while True: date_input = input("Date: ") valid = False month = day = year = "" # 处理斜杠分隔格式(如9/8/1636) if "/" in date_input: try: month, day, year = date_input.split("/") # 校验月份、日期范围 if 1 <= int(month) <= 12 and 1 <= int(day) <= 31: valid = True except ValueError: continue # 格式错误,重新输入 # 处理英文月份格式(如September 8, 1636) elif " " in date_input and "," in date_input: try: parts = date_input.split(" ") if len(parts) == 3: month_str, day_str, year = parts day = day_str.replace(",", "") # 校验月份是否存在、日期范围 if month_str in months and 1 <= int(day) <= 31: month = months[month_str] valid = True except ValueError: continue # 格式错误,重新输入 if valid: # 格式化月份和日期为两位数字 formatted_month = f"{int(month):02d}" formatted_day = f"{int(day):02d}" print(f"{year}-{formatted_month}-{formatted_day}") break
关键修正点说明
- 集合改字典:用
{键: 值}的字典存月份映射,直接通过months[month_str]拿数字,不用循环遍历,效率更高。 - 统一验证循环:把所有输入验证逻辑塞进一个
while True循环,无效输入直接重新提示,逻辑更清晰。 - 完善格式校验:对两种输入格式分别做合法性检查,包括数字范围、月份名称是否存在等。
- 规范输出格式:用
f"{int(x):02d}"确保月份和日期都是两位数字,比如1月变成"01",5日变成"05"。 - 修复语法错误:补全
months定义里缺失的冒号和逗号,避免语法报错。
内容的提问来源于stack exchange,提问作者Midget Codes
相关产品推荐
相关产品推荐

