Pythonic方式实现根据变更索引点展开列表的最优方法
Python实现按变更索引填充值的简洁方案
方案1:标准库无依赖实现(最通用)
indexes_list = [5, 6, 8, 9, 12, 15] values_list = [i * 10 for i in range(6)] # 索引前补-1统一区间计算逻辑,无需分支判断 prev_indexes = [-1] + indexes_list expanded_values = [] for prev, curr, val in zip(prev_indexes, indexes_list, values_list): expanded_values.extend([val] * (curr - prev))
运行后expanded_values结果和需求完全一致:[0, 0, 0, 0, 0, 0, 10, 20, 20, 30, 40, 40, 40, 50, 50, 50]
方案2:函数式精简写法(借助itertools)
from itertools import chain indexes_list = [5, 6, 8, 9, 12, 15] values_list = [i * 10 for i in range(6)] expanded_values = list(chain.from_iterable( [val] * (curr - prev) for prev, curr, val in zip([-1] + indexes_list, indexes_list, values_list) ))
方案3:大数据量场景最优(numpy向量化实现)
如果处理的序列长度很大,用numpy的向量化操作性能提升非常明显:
import numpy as np indexes_list = [5, 6, 8, 9, 12, 15] values_list = [i * 10 for i in range(6)] # 计算每个值的重复次数,prepend=-1对齐首段计算 repeat_counts = np.diff(indexes_list, prepend=-1) expanded_values = np.repeat(values_list, repeat_counts).tolist()
核心优化思路
原代码需要单独判断首段逻辑,本质是首段的起始位置不是前一个索引而是0,我们通过给索引序列前补-1,让所有区间的长度都可以用当前索引 - 前一个索引直接计算,统一了逻辑、去掉了分支判断,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Netanel
相关产品推荐
相关产品推荐

