慕标5832272
使用熊猫的一种方式。系列.插值:import pandas as pdpd.Series([i if i else np.nan for i in l]).interpolate().tolist()输出:[4.0, 4.666666666666667, 5.333333333333333, 6.0, 7.0, 8.0, 6.75, 5.5, 4.25, 3.0]
四季花海
使用累加从迭代工具,您可以找到每个位置周围零条纹的开始和结束索引。然后,使用这些范围计算每个零位置相对于其起始和结束非零范围边界的线性比率:from itertools import accumulaten = [4, 0, 0, 6, 0, 8, 0, 0, 0, 3]starts = accumulate(range(len(n)),lambda a,b: b if n[b] else a)ends = [*accumulate(reversed(range(len(n))),lambda a,b: b if n[b] else a)][::-1]inter = [ n[i] or n[s]+(n[e]-n[s])*(i-s)/(e-s) for i,(s,e) in enumerate(zip(starts,ends)) ]# inter = [4, 4.666666666666667, 5.333333333333333, 6, 7.0, 8, 6.75, 5.5, 4.25, 3]该列表将包含每个位置的上一个非零值的索引(对于非零值,使用位置本身):starts[0, 0, 0, 3, 3, 5, 5, 5, 5, 9]该列表包含下一个非零值的索引ends[0, 3, 3, 3, 5, 5, 9, 9, 9, 9]使用zip组合这两个列表,我们获得计算中间值所需的所有信息: start end range position Interpolation index value start end value value size in range ratio value(i) n[i] (s) (e) n[s] n[e] e-s i-s (i-s)/(e-s) see below 0 4 0 0 4 4 0 0 ----- 4 1 0 0 3 4 6 3 1 0.67 4.67 2 0 0 3 4 6 3 2 0.33 5.33 3 6 3 3 6 6 0 0 ----- 6 4 0 3 5 6 8 2 1 0.50 7.00 5 8 5 5 8 8 0 0 ----- 8 6 0 5 9 8 3 4 1 0.75 6.75 7 0 5 9 8 3 4 2 0.50 5.50 8 0 5 9 8 3 4 3 0.25 4.25 9 3 9 9 3 3 0 0 ----- 3在存在的地方保留非零值,并计算零位置的插值。startValue + (endValue-startValue) x InterpolationRatio