如何根据列表B的数值拆分列表A为对应长度的子列表
按指定长度列表拆分目标列表的Python实现
核心方案:基于切片与索引追踪
直接通过追踪起始索引,遍历指定长度列表进行切片操作是最直观的实现方式:
A = [15,2,3,42,5,6,7,82,94,12,1,21,2,3,4,5,5,3,2,2,22,3,4,5,6,6,5,...] # len(A) = 65 B = [15, 20, 4, 11, 12, 3] split_result = [] current_start = 0 for chunk_len in B: current_end = current_start + chunk_len split_result.append(A[current_start:current_end]) current_start = current_end # 验证拆分后的子列表长度是否符合要求 print([len(chunk) for chunk in split_result]) # 输出: [15, 20, 4, 11, 12, 3]
逻辑说明:
- 用
current_start记录每次切片的起始位置,初始为0 - 遍历列表B中的每个长度值,计算切片结束位置
current_end = current_start + chunk_len - 截取A中
[current_start:current_end]的子列表加入结果,然后更新起始位置为当前结束位置 - 由于题目已保证B的元素和等于A的长度,无需处理索引越界问题
进阶方案:使用itertools.accumulate简化索引计算
借助Python标准库的itertools.accumulate可以自动生成累加索引,用列表推导式一步完成拆分:
from itertools import accumulate A = [15,2,3,42,5,6,7,82,94,12,1,21,2,3,4,5,5,3,2,2,22,3,4,5,6,6,5,...] B = [15, 20, 4, 11, 12, 3] # 生成包含起始位置的累加索引:[0, 15, 35, 39, 50, 62, 65] split_indices = [0] + list(accumulate(B)) # 遍历索引对,截取对应切片 split_result = [A[split_indices[i]:split_indices[i+1]] for i in range(len(split_indices)-1)]
逻辑说明:
accumulate(B)会生成B的累加序列:15, 35, 39, 50, 62, 65- 加上初始位置0后,得到完整的切片索引边界
- 通过列表推导式遍历相邻索引对,快速生成所有子列表
内容的提问来源于stack exchange,提问作者Farmanli
相关产品推荐
相关产品推荐

