如何按指定索引列表将一个列表拆分为多个子列表?
嘿,这个需求其实很好实现,而且确实有简洁的写法!先理清楚逻辑:你的索引列表其实是拆分的结束位置(左闭右开的切片终点),比如示例里的[3,5],就是把原列表分成[0:3]、[3:5]、[5:]这三段,刚好匹配你要的输出。
一行代码解决方案
如果你追求简洁,用列表推导式就能搞定:
original = [1, 2, 3, 4, 5, 6, 7, 8] indices = [3, 5] result = [original[s:e] for s, e in zip([0] + indices, indices + [len(original)])]
运行后result就是[[1, 2, 3], [4, 5], [6, 7, 8]]。
原理很简单:
- 我们把起始点
0加到索引列表开头,把原列表长度加到索引列表结尾,得到两组拆分点:[0,3,5]和[3,5,8] - 用
zip把这两组点一一配对,得到(0,3)、(3,5)、(5,8) - 对每一对取原列表的切片,就得到拆分后的子列表
更易读的循环版本
如果觉得一行代码可读性稍差,用循环写也很清晰:
original = [1, 2, 3, 4, 5, 6, 7, 8] indices = [3, 5] split_points = [0] + indices + [len(original)] result = [] for start, end in zip(split_points[:-1], split_points[1:]): result.append(original[start:end])
这个逻辑和一行代码完全一致,只是拆分步骤更明确。
额外注意点
- 如果索引列表是空的,这个方法会直接返回
[original],符合预期 - 如果索引里有超过原列表长度的数值,切片会自动截断到列表末尾,比如
indices=[10]会得到[[1,2,3,4,5,6,7,8], []],要是想避免空列表,可以先过滤掉无效索引:valid_indices = [i for i in indices if 0 <= i <= len(original)] result = [original[s:e] for s, e in zip([0] + valid_indices, valid_indices + [len(original)])]
内容的提问来源于stack exchange,提问作者Adi219
相关产品推荐
相关产品推荐

