运行Python编辑距离代码报TypeError列表索引类型错误求助
问题排查与修复方案
核心错误原因
- 循环写法逻辑错误:
for n in lines1[n]属于语法逻辑混淆,lines1是readlines()返回的字符串列表,直接遍历该列表得到的迭代变量是字符串类型的行内容,无法作为列表的索引参数,因此触发TypeError。即使提前给n赋初始整数值,进入循环后n会被重新赋值为字符串类型的行内容/字符,后续索引操作依然报错。 - 列表追加方法错误:
list_10 += EditDistanceM(...)会触发新报错,+=操作要求右侧为可迭代对象,编辑距离返回的是单个数值,需要用append()方法追加。 - 冗余调用问题:同一次循环内调用两次
EditDistanceM,会重复计算、重复打印矩阵,属于不必要的性能浪费。 - 资源泄漏风险:打开文件后未执行关闭操作,长期运行可能导致文件句柄占用。
- 计算结果偏差问题:
readlines()返回的每行内容默认携带末尾的换行符,直接传入编辑距离函数会把换行符计入长度,导致计算结果不符合预期。
修复后可运行代码
import numpy as np # 用with上下文管理器自动关闭文件,同时去掉每行的换行符和首尾空白 with open("ex2-dnalist1.txt", "r", encoding="utf-8") as f1: lines1 = [line.strip() for line in f1.readlines()] with open("ex2-dnalist2.txt", "r", encoding="utf-8") as f2: lines2 = [line.strip() for line in f2.readlines()] def EditDistanceM(s,t): size_x = len(s) + 1 size_y = len(t) + 1 matrix = np.zeros((size_x, size_y)) for x in range(size_x): matrix[x,0] = x for y in range(size_y): matrix[0,y] = y for x in range(1, size_x): for y in range(1, size_y): if s[x-1] == t[y-1]: matrix[x,y] = min( matrix[x-1, y] + 1, matrix[x-1, y-1], matrix[x, y-1] + 1 ) else: matrix[x,y] = min( matrix[x-1, y] + 1, matrix[x-1, y-1] +1, matrix[x, y-1] + 1 ) print(matrix) return matrix[size_x - 1, size_y - 1] list_10 = [] # 直接遍历两个列表的所有元素两两组合,无需额外索引操作 for s in lines1: for t in lines2: distance = EditDistanceM(s, t) list_10.append(distance)
如果你后续业务需要用到索引做其他操作,可以将循环部分替换为以下写法:
list_10 = [] for n in range(len(lines1)): s = lines1[n] for m in range(len(lines2)): t = lines2[m] distance = EditDistanceM(s, t) list_10.append(distance)
内容的提问来源于stack exchange,提问作者Maria Mamai
相关产品推荐
相关产品推荐

