如何在Python中批量查找列表中多个目标值的索引
实现方法
针对你的需求,这里有几种实用的实现方式,可根据数据特性选择:
方法1:构建值-索引映射字典(最快,适合元素唯一的场景)
如果大列表(代码中用big_list代替你示例里的list,避免和内置关键字冲突)的元素唯一且无精度问题,可以先把大列表的元素与对应索引做成字典,之后直接通过目标值取索引,效率最高:
# 构建值到索引的映射 value_to_index = {val: idx for idx, val in enumerate(big_list)} # 遍历目标值列表获取索引 output_index = [value_to_index[val] for val in target_values]
浮点数精度处理
如果是浮点数,直接字典匹配可能因精度误差失败(比如0.001实际存储为0.0010000000001),可以先对数值做四舍五入处理:
# 保留足够位数的小数,比如3位 value_to_index = {round(val, 3): idx for idx, val in enumerate(big_list)} output_index = [value_to_index[round(val, 3)] for val in target_values]
方法2:直接遍历查找(简单直观,适合小数据量)
如果数据量不大,直接用列表的index()方法逐个查找,代码最简洁:
output_index = [] for val in target_values: # 必要时用round处理浮点数精度 idx = big_list.index(round(val, 3)) output_index.append(idx)
缺点是每次index()都会遍历整个大列表,数据量大时效率偏低。
方法3:二分查找(适合有序列表,效率更高)
从你的示例看,大列表是递增有序的,这种情况用bisect模块做二分查找,时间复杂度为O(logn),比线性查找快很多:
import bisect output_index = [] for val in target_values: # bisect_left定位第一个等于val的位置 idx = bisect.bisect_left(big_list, val) # 通过误差阈值验证匹配结果,处理浮点数精度 if idx < len(big_list) and abs(big_list[idx] - val) < 1e-6: output_index.append(idx) else: # 处理找不到目标值的情况,可根据需求调整 raise ValueError(f"值 {val} 未在big_list中找到")
这种方法尤其适合超大列表场景,容错性更强。
内容的提问来源于stack exchange,提问作者Rasoul Sadeghi
相关产品推荐
相关产品推荐

