You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:54:05