【发布时间】:2016-11-25 05:48:58
【问题描述】:
我正在寻找一种将列表拆分为预定义切片的方法:
a = list(range(1, 1001)) # Added list()
b = [200, 500, 300]
列表a 应该被分割成len(b) 子列表,其中包含a 的前200 个元素、后500 个元素和最后300 个元素。可以安全地假设sum(b) == len(a)。
这个有通用的功能吗?
【问题讨论】:
我正在寻找一种将列表拆分为预定义切片的方法:
a = list(range(1, 1001)) # Added list()
b = [200, 500, 300]
列表a 应该被分割成len(b) 子列表,其中包含a 的前200 个元素、后500 个元素和最后300 个元素。可以安全地假设sum(b) == len(a)。
这个有通用的功能吗?
【问题讨论】:
从列表中创建一个迭代器(如果它还不是),并从迭代器中为b 中的每个n 获取n 乘以next 元素。
>>> a = range(1, 1001)
>>> b = [200, 500, 300]
>>> a_iter = iter(a)
>>> [[next(a_iter) for _ in range(n)] for n in b]
[[1,
2,
...
199,
200],
[201,
...
700],
[701,
702,
...
999,
1000]]
【讨论】:
a 的内容,您需要在 next 上设置默认值以避免异常
您还可以使用itertools.islice 在预定义的块中使用a 的迭代器:
>>> from itertools import islice
>>> b = [200, 500, 300]
>>> a = range(1, 1001)
>>> it = iter(a)
>>> [list(islice(it, i)) for i in b]
【讨论】:
itertools.islice:
from itertools import islice
a = range(1, 1001)
b = [200, 500, 300]
c = iter(a)
results = [list(islice(c, length)) for length in b]
islice 的行为类似于 slice,只是 slice 接受序列并返回序列,而 islice 接受迭代并返回迭代。
迭代器是“一次性的”——一旦你从中提取元素,它就不再存在,并且下一个元素成为新的第一个元素。
【讨论】: