如何为字典列表中指定rollno的字典的total_marks累加科目分数
实现方案
你原有的写法行不通的原因:students是列表类型,索引只能是下标位置,不能直接用rollno作为索引取值,建议先将列表转换为以rollno为键的映射字典,查找匹配的效率更高,实现逻辑如下:
步骤1:将学生列表转换为rollno映射字典
首先修正原学生列表的语法(Python字典的字符串键需要加引号),再做格式转换:
students = [ {"rollno":1, "firstname":"f1", "last_name":"l1", "total_marks":0}, {"rollno":2, "firstname":"f2", "last_name":"l2", "total_marks":0}, {"rollno":3, "firstname":"f3", "last_name":"l3", "total_marks":0} ] # 转换为rollno为key的字典,后续查找效率为O(1) student_map = {stu["rollno"]: stu for stu in students}
步骤2:解析输入并累加分数
假设你的marks_list里每个元素是如rollno:1 english_marks:10格式的字符串,解析累加逻辑如下:
for marks_entry in marks_list: # 拆分键值对,去除多余空格 parts = [p.strip() for p in marks_entry.split() if p.strip()] entry_data = {} for part in parts: k, v = part.split(":", 1) # 只按第一个冒号拆分,避免值里有冒号导致解析出错 entry_data[k.strip()] = v.strip() # 提取当前记录的rollno和科目分数 current_roll = int(entry_data["rollno"]) # 科目key不固定,取非rollno的键对应的值即可 mark_val = int([v for k,v in entry_data.items() if k != "rollno"][0]) # 匹配rollno并累加分数 if current_roll in student_map: student_map[current_roll]["total_marks"] += mark_val else: # 若需要新增不存在的rollno对应的学生记录,可取消下方注释 # student_map[current_roll] = {"rollno": current_roll, "total_marks": mark_val} # 不需要新增的话直接跳过即可 pass
步骤3:(可选)回写为原列表格式
如果你之后仍需要保持原来的列表结构,可直接转换回去:
students = list(student_map.values())
效果验证
你给出的测试输入处理完成后,rollno为1的学生total_marks为40,rollno为2的学生total_marks为60,符合累加要求。
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

