使用索引列表拆分列表

问题描述

我正在尝试根据给定的另一个列表的索引对将列表分为几组:

>>> l = list(range(10))
>>> l
[0,1,2,3,4,5,6,7,8,9]
>>> idx = [0,5]

我需要分解列表,结果是:

>>> l[0:5]
[0,4]
>>> l[5:]
[5,9]

列表idx至少始终为[0],但大小可能为nidx中的值将始终按升序排序。

目前,我有:

>>> l = list(range(10))
>>> idx = [0,5]
>>> idx.append(None)
>>> [l[idx[i]:idx[i + 1]] for i in range(len(idx) - 1)]
[[0,4],[5,9]]

是否有一种无需显式附加Non并在范围内进行迭代的方法来实现此目的?

编辑:作为另一个示例...

给出:

>>> l = list(range(14))
>>> l
[0,9,10,11,12,13]
>>> idx = [0,10]

所需结果:

[[[0,9],[10,13]]

解决方法

您可以尝试itertools.zip_longest

from itertools import zip_longest

l = list(range(14))
idx = [0,5,10]
print([l[pre: next] for pre,next in zip_longest(idx,idx[1:])])

结果:

[[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13]]
,

通过numpy,您可以使用numpy.split()

import numpy as np

res =[list(x) for x in np.split(l,idx) if x.size != 0]
print(res)

输出:

[[0,13]]
,
result = [l[curr_idx:curr_idx+idx[1]] for curr_idx in idx]

结果

[[0,13]]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...