Python遍历列表构建嵌套字典仅保留最后一条数据问题求解
问题根因
你的代码核心问题是每次循环都会强制覆盖上层已存在的字典结构和下层的日期列表,两个疑问的具体解释如下:
- 疑问1解答:你在每轮循环中都执行了
main_obj[date[0]][date[1]][date[2]] = [],这行代码会把对应日期下已经存储了历史数据的列表直接覆盖为空列表,之后只追加当前遍历到的单条数据,所以永远只有最新一条记录,看起来就像没有追加成功。 - 疑问2解答:你在每轮循环中都执行了
main_obj[date[0]] = {}、main_obj[date[0]][date[1]] = {},这两行代码会直接清空已经存在的年、月层级下的所有数据。第一条27日的数据插入后,后续遍历到26日的数据时,会直接把main_obj['2021']整体重置为空字典,之前存入的27日数据直接被清除,所以最后只能看到最后一条26日的记录。
修复后代码
你可以选择两种实现方式,第一种用defaultdict简化层级判断,第二种用原生字典手动实现:
方式1:defaultdict实现(代码更简洁)
from collections import defaultdict # 自动构建年-月-日嵌套结构,日对应的值默认是列表 main_obj = defaultdict(lambda: defaultdict(lambda: defaultdict(list))) for i in res['results']: # 拆分日期和时间 full_start = i["interval_start"] date_part, time_part = full_start.split("T") year, month, day = date_part.split("-") # 按预期格式提取时分,转换consumption为字符串 start_time = time_part[:5] end_time = i["interval_end"].split("T")[1][:5] insert_obj = { "interval_start": start_time, "interval_end": end_time, "consumption": str(i["consumption"]) } # 直接追加数据,不存在的层级会自动创建 main_obj[year][month][day].append(insert_obj) # 如果需要输出普通字典格式,可以执行下面的转换 main_obj = {k: {k2: dict(v2) for k2, v2 in v.items()} for k, v in main_obj.items()} print(main_obj)
方式2:原生字典实现(无需引入第三方库)
main_obj = {} for i in res['results']: full_start = i["interval_start"] date_part, time_part = full_start.split("T") year, month, day = date_part.split("-") start_time = time_part[:5] end_time = i["interval_end"].split("T")[1][:5] insert_obj = { "interval_start": start_time, "interval_end": end_time, "consumption": str(i["consumption"]) } # 逐层判断层级是否存在,不存在才新建,避免覆盖已有数据 if year not in main_obj: main_obj[year] = {} if month not in main_obj[year]: main_obj[year][month] = {} if day not in main_obj[year][month]: main_obj[year][month][day] = [] main_obj[year][month][day].append(insert_obj) print(main_obj)
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

