Python实现两数之和取索引时index()报ValueError问题求助
错误原因分析
你对index()方法的参数规则理解有误。Python列表的index()方法语法为list.index(查找值, 起始查找索引, 结束查找索引),第二个入参是查找的起始位置,而非你以为的第二个查找目标。
当代码命中条件时,i=7,a[cnt]=20,你写的a.index(i,a[cnt])相当于从索引为20的位置开始查找7,但你的数组总长度仅为5,最大索引为4,查找范围超出数组边界,自然会抛出元素不存在的错误。
原有逻辑修正
你在循环中已经持有第二个元素的索引变量cnt,外层遍历只要通过enumerate同时获取第一个元素的索引,不需要额外调用index()即可拿到结果:
def func(a,b): for idx1, val1 in enumerate(a): cnt = 0 while cnt < len(a): val2 = a[cnt] if val1 + val2 == b and idx1 != cnt: return [idx1, cnt] cnt += 1 print(func([3,7,2,10,20],27))
注意:你原代码中的
i != a[cnt]判断逻辑存在缺陷,如果数组中存在两个相同值的元素相加等于目标值(例如[2,2],目标值4),会被错误过滤,应该改为判断两个元素的索引不同。
高效实现方案
不需要嵌套循环的O(n)复杂度方案,可以通过哈希表(字典)存储已遍历元素和对应索引,一次遍历即可完成匹配:
def func(a, target): num_map = {} for idx, val in enumerate(a): diff = target - val if diff in num_map: return [num_map[diff], idx] num_map[val] = idx print(func([3,7,2,10,20],27))
该方案不需要调用index()方法,也不需要嵌套循环,性能远高于两层循环的实现,同时也能正确处理重复值的匹配场景。
内容的提问来源于stack exchange,提问作者Butterman
相关产品推荐
相关产品推荐

