Deap运行时触发KeyError: '244'错误,求解决方案
解决DEAP框架代码中的KeyError: '244'问题
首先看你遇到的错误追踪信息:
C:\Python27\python.exe C:/Users/Adekunle/PycharmProjects/d4jtest/newDp.py Traceback (most recent call last): File "C:/Users/Adekunle/PycharmProjects/d4jtest/newDp.py", line 166, in <module> main_run("C:\defect4j\TinyGP") File "C:/Users/Adekunle/PycharmProjects/d4jtest/newDp.py", line 151, in main_run Fitness, RawScore, Formula = main() File "C:/Users/Adekunle/PycharmProjects/d4jtest/newDp.py", line 130, in main halloffame=hof, verbose=True) File "C:\Python27\lib\site-packages\deap\algorithms.py", line 150, in eaSimple fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) File "C:/Users/Adekunle/PycharmProjects/d4jtest/newDp.py", line 82, in eval_func spectrum = FaultVersionsDict[str(numberOfversion[version])] KeyError: '244' Process finished with exit code 1
错误根源分析
这个KeyError的核心问题出在readcsv()函数里的逻辑错误:
你在循环读取每个csv文件时,每次都重新初始化了FaultVersionsDict = {}和i=0,这意味着循环结束后,字典里只会保留最后一个文件的键'0',而你的numberOfversion是随机从0-254中选取的数值(比如244),自然找不到对应的键,触发KeyError。
修复步骤
1. 修复readcsv()函数
把字典和计数器i的初始化移到for循环外面,确保每个文件的索引都能正确存入字典:
def readcsv(): files = datafile() nFaultVersion = len(files) vFaultLocation = np.zeros(nFaultVersion) vStatementCount = np.zeros(nFaultVersion) i = 0 FaultVersionsDict = {} # 移到循环外初始化 for csvfiles in files: nFirstFault = (pd.read_csv(csvfiles, sep=',', nrows=0)).columns[0] df = pd.read_csv(csvfiles, skiprows=1, header=None).values dset = list(list(float(elem) for elem in row) for row in df) vFaultLocation[i] = nFirstFault vStatementCount[i] = df.shape[0] FaultVersionsDict[str(i)] = df i = i + 1 return [vFaultLocation, vStatementCount, FaultVersionsDict]
2. 修复其他潜在问题
除了KeyError,你的代码还有两个需要修正的地方:
- 路径转义问题:Windows路径里的
\需要转义成\\或者用原始字符串,比如把main_run("C:\defect4j\TinyGP")改成main_run(r"C:\defect4j\TinyGP"),避免转义字符引发的错误。 - 变量赋值不匹配:
main()函数返回的是pop, log, hof,但你在main_run里写的是Fitness, RawScore, Formula = main(),这会触发ValueError,要改成:
pop, log, hof = main() # 如果你要保存适应度和公式,应该从log和hof里提取对应内容 # 比如保存最优公式: best_formula = hof[0] if hof else None
验证修复
修改后,FaultVersionsDict会包含所有csv文件对应的索引键(从0到文件总数-1),当numberOfversion选取这个范围内的数值时,就能正常访问到对应的spectrum数据,不会再触发KeyError。
内容的提问来源于stack exchange,提问作者Eyinlojuoluwa
相关产品推荐
相关产品推荐

