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
相关产品推荐
相关产品推荐

