Python函数中遍历两个列表比对元素报索引错误,该如何正确实现循环?
报错核心原因
触发报错的根源是循环写法的逻辑和预期不符:
写for i in a,b:时,Python会将a,b解析为包含两个元素的元组(a, b),循环过程中i会依次拿到完整的a列表、完整的b列表,而不是你预期的0、1、2这类整数索引。当后续执行a[i]时,相当于把列表本身当作索引值传入,自然会抛出「list indices must be integers or slices, not list」的错误。
另外原代码中判断两元素相等的分支elif a[i] == b[i]: ap = ap + 0没有实际作用,既不改动a的得分,也不影响b的得分,完全可以删除。
正确遍历的两种实现方式
- 基于整数索引遍历
用range(len(a))生成和列表长度匹配的整数索引序列,按位置取值对比,对应代码片段:for i in range(len(a)): if a[i] > b[i]: ap += 1 elif b[i] > a[i]: bp += 1 - 基于元素配对遍历(更推荐)
用Python内置的zip把两个列表对应位置的元素打包成一一配对的元组,直接遍历元素值,不需要手动操作索引,从根源上避免索引类型错误,对应代码片段:for ai, bi in zip(a, b): if ai > bi: ap += 1 elif bi > ai: bp += 1
修正后可直接运行的完整代码
def compareTriplets(a, b): ap = 0 bp = 0 for ai, bi in zip(a, b): if ai > bi: ap += 1 elif bi > ai: bp += 1 return ap, bp a = [5,3,2] b = [5,1,9] comparison = compareTriplets(a,b) print(comparison)
运行上述代码的输出结果为(1, 1),匹配逐对比对的得分计算逻辑:第一对元素5和5平手无得分,第二对元素3大于1给ap加1分,第三对元素2小于9给bp加1分。
补充说明:如果后续需要比对的列表长度不一致,
zip会以更短的列表长度为截断标准;本场景为固定长度的三元组比对,两个列表长度完全一致,不存在截断问题。
内容的提问来源于stack exchange,提问作者Calvin Ogata
相关产品推荐
相关产品推荐

