x = [2, 1, 2, 0, 1, 2, 2]
我想将以上列表拼接为length = [1, 2, 3, 1]
的子列表。换句话说,我希望我的输出看起来像这样:
[[2], [1, 2], [0, 1, 2], [2]]
第一个子列表的长度为1,第二个子列表的长度为2,依此类推。
答案 0 :(得分:9)
您可以在此处使用itertools.islice
来每次迭代消耗N个源列表中的许多元素,例如:
from itertools import islice
x = [2, 1, 2, 0, 1, 2, 2]
length = [1, 2, 3, 1]
# get an iterable to consume x
it = iter(x)
new_list = [list(islice(it, n)) for n in length]
给你:
[[2], [1, 2], [0, 1, 2], [2]]
答案 1 :(得分:0)
基本上,我们要提取一定长度的子字符串。 为此,我们需要一个start_index和一个end_index。 end_index是您的start_index +我们要提取的当前长度:
x = [2, 1, 2, 0, 1, 2, 2]
lengths = [1,2,3,1]
res = []
start_index = 0
for length in lengths:
res.append(x[start_index:start_index+length])
start_index += length
print(res) # [[2], [1, 2], [0, 1, 2], [2]]
将此解决方案添加到其他答案中,因为它不需要任何导入的模块。
答案 2 :(得分:0)
您可以使用以下listcomp:
from itertools import accumulate
x = [2, 1, 2, 0, 1, 2, 2]
length = [1, 2, 3, 1]
[x[i - j: i] for i, j in zip(accumulate(length), length)]
# [[2], [1, 2], [0, 1, 2], [2]]