如何查找列表中唯一值最后一次出现的索引,是否有更优实现方案?
列表唯一值最后一次出现索引的优化实现
你当前的实现可以正常运行,但存在两个可优化的点:
- 时间复杂度偏高:每次调用
a[::-1].index(i)都要遍历一次反转后的列表,整体时间复杂度为O(n*m)(n为原列表长度,m为唯一值数量),列表越大性能下降越明显 - 操作冗余:已经调用了numpy的
unique方法,完全可以用numpy原生参数直接得到结果,不需要手动计算索引
下面提供两种更优的实现方案:
方案1:纯Python无依赖实现(O(n)时间复杂度)
仅需一次正向遍历,用字典记录每个值最后一次出现的索引即可,性能最优,无第三方依赖:
a = [1,2,3,5,6,1,2,4,5] if a: last_occur = {} for idx, val in enumerate(a): last_occur[val] = idx # 按唯一值升序排序,结果和示例输出顺序一致 idx = [last_occur[v] for v in sorted(last_occur.keys())]
输出结果和示例完全一致:[5, 6, 2, 7, 8, 4]
方案2:numpy原生实现(简洁高效,适合大数据量)
numpy的unique方法本身就支持直接返回最后一次出现的索引,无需手动计算,代码更简洁,底层为C实现,处理大数组时效率远高于纯Python循环:
import numpy as np a = [1,2,3,5,6,1,2,4,5] if len(a) != 0: # keep='last'指定保留最后一次出现的记录,return_index=True返回对应索引 unique_val, idx = np.unique(a, return_index=True, keep='last')
得到的idx直接就是需要的结果,输出为array([5, 6, 2, 7, 8, 4]),转成普通列表调用tolist()方法即可。
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

