Python比对三个大小不同的numpy数组并查找首个匹配元素的方法
实现方案
报错原因
你遇到的索引越界错误,是因为错误使用长度更大的arrya/arryb的索引值,直接访问长度更小的arryc元素。比如arrya长度为7,当循环到索引4时去取arryc[4],但arryc最大合法索引仅为3,自然触发越界报错。
正确实现逻辑
优先采用字典预存arryc的元素与位置映射,匹配效率为O(1),同时完全规避索引越界问题:
- 提前把
arryc的元素对应1基索引存为查询字典 - 按索引从小到大遍历
arrya/arryb的每个位置,优先校验arrya当前索引的元素是否在arryc映射中,命中则直接返回结果 - 若
arrya当前元素未命中,再校验同索引的arryb元素,命中则返回结果 - 全量遍历后无匹配则返回无匹配提示
代码示例
# 示例数组 arrya = [100,25,56,78,90,52,13] arryb = [93,42,52,25,10,11,24] arryc = [52,13,24,100] # 构造arryc元素到1基索引的映射字典 c_map = {val: idx+1 for idx, val in enumerate(arryc)} # 遍历查询首个匹配 for idx in range(len(arrya)): # 先校验arrya当前元素 a_val = arrya[idx] if a_val in c_map: print(f"首个匹配项为arryc第{c_map[a_val]}位的元素与arrya索引{idx}的元素匹配") break # 再校验arryb当前元素 b_val = arryb[idx] if b_val in c_map: print(f"首个匹配项为arryc第{c_map[b_val]}位的元素与arryb索引{idx}的元素匹配") break else: print("未找到任何匹配项")
运行上述代码输出结果和预期完全一致:首个匹配项为arryc第4位的元素与arrya索引0的元素匹配
内容的提问来源于stack exchange,提问作者Aurepilous
相关产品推荐
相关产品推荐

