问题描述
我正在尝试根据给定的另一个列表的索引对将列表分为几组:
>>> 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]
,但大小可能为n
; idx
中的值将始终按升序排序。
目前,我有:
>>> 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]]