Python添加字典元素时触发KeyError:1报错求助
解决Python字典的KeyError:1问题
我来帮你分析下报错的原因和具体解决办法:
问题根源
你的字典y一开始只初始化了y[0] = 0.2,但循环是从i=1到i=N-1(因为range(1,N)的取值范围是左闭右开)。当i=1时,y[i-1]是y[0],这时候没问题;但当i=2时,y[i-1]变成了y[1],而这个键在你的字典里从来没被定义过,Python就会抛出KeyError:1的报错。
解决方案
有两种实用的解决方式,你可以根据自己的需求选择:
方式一:在循环中给字典y补充新键
每次计算完yt[i]后,把它赋值给y[i],这样下一次循环就能正常获取前一个位置的值了。补全后的代码如下:
import numpy as np import math from math import * x = { 0: 0.3 } xt = {} N=10 y = { 0: 0.2 } yt = {} def a(z,s): return sqrt(z)+s def delta(r1,r2): sig=0.055 d=sig*(np.sqrt(-2*np.log(r1))*np.cos(np.radians(r2))) return d for i in range(1,N): R1=np.random.uniform(0,1) R2=np.random.uniform(0, 360) # 补全你未写完的范围,因为delta里用到了弧度转换,这里默认取0-360度 yt[i] = y[i-1] + delta(R1,R2) y[i] = yt[i] # 将当前计算的yt值存入y,供下一次循环调用
方式二:改用列表代替字典
因为你的索引是连续的0到N-1,用列表比字典更适配场景,不仅代码更简洁,还能从根源避免键缺失的问题。改造后的代码:
import numpy as np import math from math import * x = [0.3] xt = [] N=10 y = [0.2] yt = [] def a(z,s): return sqrt(z)+s def delta(r1,r2): sig=0.055 d=sig*(np.sqrt(-2*np.log(r1))*np.cos(np.radians(r2))) return d for i in range(1,N): R1=np.random.uniform(0,1) R2=np.random.uniform(0, 360) next_val = y[i-1] + delta(R1,R2) yt.append(next_val) y.append(next_val)
小建议
如果你的数据是按顺序排列的连续索引,优先选择列表而非字典——列表的索引访问是天然连续的,不会出现键缺失的问题,代码维护起来也更简单。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

