Python中字典元素与列表相乘结果被覆盖的问题求助
字典元素相乘结果被覆盖的问题解决
问题背景
需要实现:将字典num的每个元素与列表x中的元素分别相乘,结果存入新字典resu,以num的键作为resu的键。但运行代码后,num最后一个元素的计算结果覆盖了之前所有元素的结果。
原代码
def mult(num, x): return num * x num = {'one':1, 'two':2, 'three':3} x = [11, 12, 13, 14, 15, 16, 17] r = dict() resu = dict() for k, n in num.items(): for i in x: prod = mult(n, i) r[i] = prod resu[k] = r resu
当前输出
{'one': {11: 33, 12: 36, 13: 39, 14: 42, 15: 45, 16: 48, 17: 51}, 'two': {11: 33, 12: 36, 13: 39, 14: 42, 15: 45, 16: 48, 17: 51}, 'three': {11: 33, 12: 36, 13: 39, 14: 42, 15: 45, 16: 48, 17: 51}}
期望输出
{'one': {11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17}, 'two': {11: 22, 12: 24, 13: 26, 14: 28, 15: 30, 16: 32, 17: 34}, 'three': {11: 33, 12: 36, 13: 39, 14: 42, 15: 45, 16: 48, 17: 51}}
问题原因
字典r定义在外层循环之外,所有num的键最终都指向同一个字典对象。每次内层循环都会修改这个r的内容,最后一次循环(对应three:3)的结果会覆盖之前所有修改,导致resu中所有键都引用同一个最终的r字典。
解决方案
方案1:每次外层循环新建字典
在每次遍历num的键值对时,重新创建一个空字典r,确保每个键对应独立的字典:
def mult(num, x): return num * x num = {'one':1, 'two':2, 'three':3} x = [11, 12, 13, 14, 15, 16, 17] resu = dict() for k, n in num.items(): r = dict() # 每次循环初始化新字典 for i in x: prod = mult(n, i) r[i] = prod resu[k] = r print(resu)
方案2:使用字典推导式简化代码
用嵌套字典推导式直接生成结果,更简洁高效:
def mult(num, x): return num * x num = {'one':1, 'two':2, 'three':3} x = [11, 12, 13, 14, 15, 16, 17] resu = {k: {i: mult(n, i) for i in x} for k, n in num.items()} print(resu)
内容的提问来源于stack exchange,提问作者Nelson Xinjia
相关产品推荐
相关产品推荐

