Python如何修改字典值(列表)中依赖另一字典的指定元素
实现方法
你不需要在每次遍历到作弊题号时都调用update替换整个列表,存储得分的列表是Python可变对象,直接定位对应索引修改值即可,逻辑更简洁、运行效率更高。
正确实现代码
# 原始数据 user_probstat_dict = {'106095014': [3, 1, 1], '106095029': [3, 1, 0], '106095033': [3, 1, 0]} user_cheatprob_dict = {'106095029': [1, 3], '106095033': [3]} for user_id, cheat_probs in user_cheatprob_dict.items(): # 取出当前学生的得分列表(拿到的是原列表的引用,修改会直接同步到字典中) score_list = user_probstat_dict[user_id] for prob_id in cheat_probs: # 题目编号从1开始,列表索引从0开始,做偏移转换 score_index = prob_id - 1 # 直接将对应位置得分置0 score_list[score_index] = 0
运行后打印user_probstat_dict即可得到预期结果:
{'106095014': [3, 1, 1], '106095029': [0, 1, 0], '106095033': [0, 1, 0]}
关于你原有代码中???位置的补充说明
如果你坚持要用update方法替换整个值(不推荐,每次循环都要生成新列表,存在冗余开销),需要先复制原得分列表,修改对应索引位置的值后再传入,写法如下:
for u, c in user_cheatprob_dict.items(): for ci in c: prob_ind = ci - 1 # 复制原得分列表 new_score_list = user_probstat_dict[u].copy() # 修改对应位置为0 new_score_list[prob_ind] = 0 user_probstat_dict.update({u: new_score_list})
注意:如果不先复制列表直接修改原列表再传入,虽然也能得到正确结果,但
update操作完全是多余的,没有实际意义。
内容的提问来源于stack exchange,提问作者luoluoluo
相关产品推荐
相关产品推荐

