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

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'这类时段对应的值?


解决方案

错误原因

你的代码逻辑存在两处问题:

  1. sterilised_list的外层键是数字1-5,而你用时段字符串(如'10:00 11:00')去外层字典取值,自然会返回"Not Found"——时段是外层字典值(子字典)的键,应该从对应的子字典中获取值。
  2. 循环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}")

代码说明

  1. 将ast.literal_eval()放在循环外,避免重复转换字符串,提升效率。
  2. 通过day键直接获取当天的子字典day_schedule,处理无日程的情况避免报错。
  3. 遍历子字典的items(),直接获取时段(time_slot)和对应的课程列表(courses),即可拿到如['35,Piano']这类目标值。

内容的提问来源于stack exchange,提问作者Chris McCartney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:21:04