如何高效创建指定位置填充指定值的列表?
高效生成目标列表的实现方案
需求明确
给定值列表lst1和位置模板列表lst2,需将lst1中的每个子列表与lst2中的每个位置模板组合,生成目标列表:
- 每个位置模板包含两组1-based位置,分别对应值子列表的两个元素
- 将对应元素填充到模板指定的位置,得到最终结果
示例数据
值列表:
lst1 = [[8,9],[6,7]]
位置模板列表:
lst2 = [[[1,2],[3,4]],[[1,3],[2,4]],[[1,4],[2,3]]]
期望输出:
result = [[8,8,9,9],[8,9,8,9],[8,9,9,8],[6,6,7,7],[6,7,6,7],[6,7,7,6]]
高效实现思路
避免先创建空列表再逐个替换的低效操作,通过预生成位置映射+列表推导式实现:
- 预解析位置模板,将每个模板的1-based位置转换为0-based索引到值索引(0或1)的映射,仅处理一次
lst2 - 利用Python优化后的列表推导式,通过映射直接取值生成结果,减少冗余计算
代码实现
lst1 = [[8,9],[6,7]] lst2 = [[[1,2],[3,4]],[[1,3],[2,4]],[[1,4],[2,3]]] # 预生成位置模板的索引映射:0-based索引 → 值子列表的索引(0或1) template_maps = [] for pos_pair in lst2: pos1, pos2 = pos_pair idx_map = {} # 映射第一组位置到值子列表的第0个元素 for p in pos1: idx_map[p-1] = 0 # 映射第二组位置到值子列表的第1个元素 for p in pos2: idx_map[p-1] = 1 template_maps.append(idx_map) # 生成最终结果 result = [ [vals[idx_map[i]] for i in range(4)] for vals in lst1 for idx_map in template_maps ] print(result)
效率说明
- 预生成映射:仅对
lst2做一次解析,避免后续循环中重复处理位置信息 - 直接索引取值:跳过条件判断或多次赋值操作,利用Python列表的O(1)索引特性
- 列表推导式:底层由C实现,比显式嵌套for循环执行速度更快
内容的提问来源于stack exchange,提问作者user22713616
相关产品推荐
相关产品推荐

