数据库逐取多字典数据合并为列表时出现嵌套问题求助
问题分析与解决方案
嘿,我一眼就瞅出你代码里的问题啦!你想要把同一个学生的多个学习时段合并成一个列表,但现在出现了多层嵌套的情况,核心原因是第一次添加数据时没把单个时段包装成列表,后续拼接又错误地用了列表嵌套的方式。
为什么你的代码会出问题?
你看,第一次进入if分支时,直接把parsed_user_detail加进了列表,这时候parsed_user_details[0]['study_time'](你代码里写的是time,应该是笔误吧?)是单个字典,不是列表。等第二次进入else分支时,你写了:
parsed_user_details[0]['time'] = [ parsed_user_details[0]['time'], parsed_user_detail['time'], ]
这就把之前的单个字典和新字典拼成了一个新列表,结果变成[字典, 新字典]。第三次进入else时,又把这个列表和新字典再拼成[[旧列表], 新字典],自然就出现多层嵌套了!
修正后的代码(针对单个学生)
我们只需要调整两个地方:第一次添加时把单个时段包装成列表,后续直接用append往列表里加新元素,而不是拼接嵌套:
import sys parsed_user_details = [] # 模拟从数据库逐个获取的单条数据 data_entries = [ {'name':'a', 'study_time':{'start':9,'end':10}}, {'name':'a', 'study_time':{'start':11,'end':12}}, {'name':'a', 'study_time':{'start':13,'end':15}}, {'name':'a', 'study_time':{'start':16,'end':19}}, {'name':'a', 'study_time':{'start':20,'end':21}} ] for parsed_user_detail in data_entries: if len(parsed_user_details) == 0: # 第一次添加:把单个study_time包装成列表再存入 user_item = parsed_user_detail.copy() # 避免修改原数据 user_item['study_time'] = [user_item['study_time']] parsed_user_details.append(user_item) print("I am inside if", parsed_user_details, file=sys.stderr) else: # 后续直接往已有的study_time列表里追加新时段 parsed_user_details[0]['study_time'].append(parsed_user_detail['study_time']) print("I am inside else", parsed_user_details) # 最终你想要的结果 print("Final Result:", parsed_user_details)
运行这段代码后,就能得到你期望的结构:
[ { 'name': 'a', 'study_time': [ {'start': 9, 'end': 10}, {'start': 11, 'end': 12}, {'start': 13, 'end': 15}, {'start': 16, 'end': 19}, {'start': 20, 'end': 21} ] } ]
扩展:支持多个学生的通用方案
如果数据库里有多个学生的数据,用上面的代码只能处理第一个学生。我们可以用字典按name分组,这样更通用:
import sys user_schedule_map = {} data_entries = [ {'name':'a', 'study_time':{'start':9,'end':10}}, {'name':'a', 'study_time':{'start':11,'end':12}}, {'name':'b', 'study_time':{'start':8,'end':10}}, {'name':'a', 'study_time':{'start':13,'end':15}}, {'name':'b', 'study_time':{'start':14,'end':16}} ] for entry in data_entries: name = entry['name'] time_slot = entry['study_time'] if name not in user_schedule_map: # 新学生:创建条目并把时段包装成列表 user_schedule_map[name] = {'name': name, 'study_time': [time_slot]} else: # 已有学生:直接追加时段 user_schedule_map[name]['study_time'].append(time_slot) # 转成你需要的列表格式 parsed_user_details = list(user_schedule_map.values()) print("Final Result:", parsed_user_details)
这样不管有多少个学生,都能自动把他们的学习时段合并到对应的条目里~
内容的提问来源于stack exchange,提问作者user11862294
相关产品推荐
相关产品推荐

