Python列表计算元素变化位置索引的最快实现方法
高效实现方案
你的原实现问题在于用字典存储值对应的索引,字典的键具有唯一性,当同一个值多次重复出现时,会覆盖之前记录的索引,自然无法识别元素回退/重复出现的变化场景。
下面是单次遍历O(n)时间复杂度的最优实现,无额外依赖,原生Python运行效率最高,完全匹配需求:
def get_change_indices(input_list): if not input_list: return [] res = [] prev_val = input_list[0] for idx, current_val in enumerate(input_list[1:], start=1): if current_val != prev_val: res.append(idx) prev_val = current_val return res
测试验证
- 测试用例1:
[1, 1, 2, 2, 2, 3, 4, 4, 4]
输出:[2, 5, 6],完全符合预期 - 测试用例2:
[1, 1, 2, 2, 2, 3, 4, 4, 4, 1, 1]
输出:[2, 5, 6, 9],正确识别最后1重新出现的变化位置
性能说明
- 整个过程只遍历列表1次,无额外中间数据结构开销,内存占用极低
- 用
enumerate直接获取索引,避免手动计算索引的额外开销 - 不需要导入任何第三方库,函数调用成本远低于用numpy、pandas等需要做数据类型转换的实现,高频调用场景下效率优势非常明显
如果你使用的是Python3.10及以上版本,还可以用itertools的pairwise进一步简化代码,性能和上面的实现几乎一致:
from itertools import pairwise def get_change_indices(input_list): return [idx for idx, (a, b) in enumerate(pairwise(input_list), start=1) if a != b]
内容的提问来源于stack exchange,提问作者mmz
相关产品推荐
相关产品推荐

