Python中如何在同一公式使用嵌套列表元素?解决语法报错问题
代码报错排查与嵌套列表元素引用方法
SyntaxError直接触发原因
报错指向loss = -1/n * sum代码行,本质是上一行的表达式括号未闭合:解释器解析到第6行的累加语句时,发现左括号数量多于右括号,表达式未完成截断,无法继续向下解析,因此将下一行代码的位置标记为语法错误触发点。
代码存在的全部语法与逻辑错误
- 括号匹配错误:第6行累加表达式开启2个左括号,但仅写了1个右括号,直接导致表达式解析中断
- 内置函数调用格式错误:
n = len[A]错误使用方括号给len函数传参,Python内置len()必须用圆括号传入参数,方括号是序列下标的专用操作符 - 循环取值逻辑错误:
for i in A迭代拿到的是A中的每一个子列表,而非列表的索引值,后续使用A[i]取值会直接触发类型错误 - 未定义变量:代码中使用变量
j作为下标,但全程未定义j的取值规则,运行时会触发NameError - 变量名冲突:使用内置函数
sum作为自定义变量名,会覆盖Python原生求和函数,存在潜在运行风险 - 公式逻辑错误:原累加项括号嵌套错误,将
(1-A[i]) * log10(1-A[j])的乘法关系错写为与前置项相加的结构,完全偏离交叉熵计算逻辑;同时运算优先级缺失,1-A[i] * math.log10(...)会被解析为1减去“A[i]乘对数值”,而非“(1-A[i])乘对数值”
嵌套列表的正确引用规则
对于结构为[[值1, 值2], [值1, 值2], ...]的二维嵌套列表,可按照以下方式高效取值,避免下标操作出错:
- 遍历外层列表时,可直接拿到每一个内部子列表对象,不需要通过索引遍历外层列表
- 对单个内部子列表,用下标
[0]、[1]即可取到对应位置的元素,也可以通过拆包语法val1, val2 = 子列表一次性取出两个元素 - 减少手动索引操作,可规避大部分下标越界、类型不匹配的错误
修正后的可运行代码
import math def equate(A): n = len(A) total_loss = 0 for item in A: # 拆包取出当前子列表的标签值与预测概率值 label, prob = item # 修正括号匹配与运算优先级,还原正确的累加计算逻辑 total_loss += label * math.log10(prob) + (1 - label) * math.log10(1 - prob) loss = -1 / n * total_loss return loss A = [[1, 0.4], [0, 0.5], [0, 0.9], [0, 0.3], [0, 0.6], [1, 0.1], [1, 0.9], [1, 0.8]] Answer = equate(A) print(Answer)
运行上述代码可得到计算结果约为0.424,符合二分类平均交叉熵的计算预期。
内容的提问来源于stack exchange,提问作者Prasad Patil
相关产品推荐
相关产品推荐

