Python嵌套字典取值失败:如何正确获取时段对应值?
问题:如何正确获取嵌套字典中时段对应的值?
我有一个通过SQL查询获取字符串,再经ast.literal_eval()转换得到的嵌套字典,结构如下:
{1: {'10:00 11:00': ['35,Piano']}, 2: {'10:00 11:00': ['39,Piano']}, 3: {'8:45 9:15': ['88,Piano'], '9:15 9:45': ['89,Piano'], '9:45 10:15': ['99,Piano']}, 4: {'9:00 9:30': ['100,Piano', '117,Piano'], '9:30 10:00': ['124,Piano'], '10:00 10:30': ['125,Piano'], '10:30 11:00': ['126,Piano'], '11:00 11:30': ['127,Piano']}, 5: {'9:00 9:30': ['128,Piano'], '9:30 10:00': ['129,Piano'], '10:00 10:30': ['130,Piano'], '10:30 11:00': ['131,Piano']}}
我尝试获取每个时段对应的所有值,但当前代码无法找到值,代码如下:
days_in_current_timetable = [1,2,3,4,5] for x in days_in_current_timetable: # data is retrieved from an SQL query as a string so used ast.literal_eval() to convert self.sterilised_list = ast.literal_eval(raw_data[1]) print("This is The Dictionary: ", sterilised_list) for slot in self.sterilised_list.values(): for key in slot: print("This is the key:", key) print("This is the value: ", sterilised_list.get(key, "Not Found"))
输出示例显示取值结果为"Not Found",请问该如何正确获取如'35,Piano'这类时段对应的值?
解决方案
错误原因
你的代码逻辑存在两处问题:
sterilised_list的外层键是数字1-5,而你用时段字符串(如'10:00 11:00')去外层字典取值,自然会返回"Not Found"——时段是外层字典值(子字典)的键,应该从对应的子字典中获取值。- 循环
days_in_current_timetable时重复执行ast.literal_eval(raw_data[1]),属于冗余操作,转换步骤只需执行一次。
正确代码
import ast # 先完成字符串到字典的转换,只需执行一次 self.sterilised_list = ast.literal_eval(raw_data[1]) days_in_current_timetable = [1,2,3,4,5] for day in days_in_current_timetable: # 获取当天的日程子字典 day_schedule = self.sterilised_list.get(day, {}) if not day_schedule: print(f"第{day}天无日程安排") continue # 遍历当天的所有时段和对应课程 for time_slot, courses in day_schedule.items(): print(f"第{day}天 - 时段: {time_slot}") print(f"对应课程列表: {courses}") # 如需逐个输出课程,可添加内层循环 for course in courses: print(f"课程详情: {course}")
代码说明
- 将
ast.literal_eval()放在循环外,避免重复转换字符串,提升效率。 - 通过
day键直接获取当天的子字典day_schedule,处理无日程的情况避免报错。 - 遍历子字典的
items(),直接获取时段(time_slot)和对应的课程列表(courses),即可拿到如['35,Piano']这类目标值。
内容的提问来源于stack exchange,提问作者Chris McCartney
相关产品推荐
相关产品推荐

