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

Python如何计算含特殊值-1列表的非特殊元素相邻索引差

问题描述

假设存在如下Python列表:

a = [70,66,63,-1,-1,68,-1,70]

原有代码用于获取所有非-1元素的相邻索引差列表(已知约束:-1不会出现在列表末尾):

res = [idx for idx, val in enumerate(a) if val != -1]
index_diff = [x - res[i - 1] for i, x in enumerate(res)][1:]

原代码运行后得到的index_diff结果为:

[1, 1, 3, 2]

现需要调整计算逻辑:计算相邻非-1元素的索引差时,需要扣除两个元素之间间隔的-1的数量。比如示例中63和68之间存在2个-1,68和70之间存在1个-1,扣除对应数量后期望得到的结果为:

[1,1,1,1]
实现方案

通用兼容写法

和原有代码逻辑衔接,直接统计相邻非-1元素之间的-1数量,从索引差中扣除即可,后续如果间隔中出现其他非-1特殊值也能兼容:

a = [70,66,63,-1,-1,68,-1,70]
res = [idx for idx, val in enumerate(a) if val != -1]
index_diff = []
for i in range(1, len(res)):
    prev_pos = res[i-1]
    curr_pos = res[i]
    # 统计两个非-1元素之间的-1个数
    gap_minus_count = a[prev_pos+1:curr_pos].count(-1)
    index_diff.append(curr_pos - prev_pos - gap_minus_count)

运行后index_diff输出为[1, 1, 1, 1],符合预期。

性能优化写法

由于res已经按顺序存储了所有非-1元素的索引,相邻两个索引之间的元素必然全是-1,不需要切片遍历统计,直接通过索引计算即可:

a = [70,66,63,-1,-1,68,-1,70]
res = [idx for idx, val in enumerate(a) if val != -1]
index_diff = [1]*(len(res)-1)

该写法时间复杂度更低,在当前题设规则下,相邻非-1元素扣除间隔的-1后差值恒为1,直接生成对应长度的全1列表即可满足需求。


内容的提问来源于stack exchange,提问作者Song Calderone Zhang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:18:04