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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:39:02