如何更简洁地基于指定列表将一维列表拆分为嵌套列表?
基于指定列表拆分一维列表的优化解法
需求是根据list2中的元素长度,将list1拆分为对应长度的嵌套列表,示例如下:
list1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] list2 = [3, 4, 2, 6] # 预期结果 solution = [[1, 2, 3], [4, 5, 6, 7], [8, 9], [10, 11, 12, 13, 14, 15]]
我目前的实现方式如下,但觉得不够简洁:
list1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] list2 = [3, 4, 2, 6] j = 0 solution= [] for i in list2: solution.append(list1[j:i+j]) j += i
希望能得到更简便高效的实现方案。
优化解法1:使用itertools.accumulate生成切片索引
利用itertools.accumulate快速生成每个子列表的起始和结束索引,结合列表推导式实现紧凑写法:
from itertools import accumulate list1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] list2 = [3, 4, 2, 6] indices = [0] + list(accumulate(list2)) solution = [list1[indices[k]:indices[k+1]] for k in range(len(list2))]
优化解法2:生成器函数封装
如果需要逻辑复用,可封装成生成器函数,兼顾可读性和灵活性:
def split_list_by_lengths(original, lengths): start = 0 for length in lengths: end = start + length yield original[start:end] start = end list1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] list2 = [3, 4, 2, 6] solution = list(split_list_by_lengths(list1, list2))
优化解法3:简化原循环写法
原逻辑本身效率很高,可简化为更紧凑的形式,保持可读性的同时减少冗余:
list1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] list2 = [3, 4, 2, 6] solution, start = [], 0 for l in list2: solution.append(list1[start:start+l]) start += l
以上几种方法均能满足需求:itertools.accumulate写法最简洁,生成器函数适合复用场景,简化后的原循环则兼顾效率和可读性。
内容的提问来源于stack exchange,提问作者T S
相关产品推荐
相关产品推荐

