有没有另一种方法可以将列表分成大小相等的箱子,并将剩余部分(如果有)放入第一个箱子?
Is there another way to split a list into bins of equal size and put the remainder if any into the first bin?
给定一个排序列表:
x = list(range(20))
我可以将列表分成相等的大小,然后将剩余部分放入左侧的容器中:
def split_qustions_into_levels(questions, num_bins=3):
num_questions = len(questions)
equal_size = int(num_questions / num_bins)
slices = [equal_size] * num_bins
slices[0] += len(questions) % num_bins
return [[questions.pop(0) for _ in questions[:s]] for s in slices]
如果我有 20 个项目列表中的 3 个 bin,我应该得到一个大小为 (7,7,6)
:
的输出列表
>>> x = list(range(20))
>>> split_qustions_into_levels(x, 3)
[[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19]]
如果我想要从 20 个项目的列表中取出 6 个箱子,我应该得到大小为 (5,3,3,3,3,3)
:
的列表的输出列表
>>> x = list(range(20))
>>> split_qustions_into_levels(x, 6)
[[0, 1, 2, 3, 4],
[5, 6, 7],
[8, 9, 10],
[11, 12, 13],
[14, 15, 16],
[17, 18, 19]]
有没有另一种方法可以做到这一点,而不需要对切片和相等大小进行混乱的计算,并且左键将每个项目弹出到列表列表中?
有numpy
解决方案吗?
也许array_split()
就是你想要的。
a = np.arange(20)
np.array_split(a, 6)
给定一个排序列表:
x = list(range(20))
我可以将列表分成相等的大小,然后将剩余部分放入左侧的容器中:
def split_qustions_into_levels(questions, num_bins=3):
num_questions = len(questions)
equal_size = int(num_questions / num_bins)
slices = [equal_size] * num_bins
slices[0] += len(questions) % num_bins
return [[questions.pop(0) for _ in questions[:s]] for s in slices]
如果我有 20 个项目列表中的 3 个 bin,我应该得到一个大小为 (7,7,6)
:
>>> x = list(range(20))
>>> split_qustions_into_levels(x, 3)
[[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19]]
如果我想要从 20 个项目的列表中取出 6 个箱子,我应该得到大小为 (5,3,3,3,3,3)
:
>>> x = list(range(20))
>>> split_qustions_into_levels(x, 6)
[[0, 1, 2, 3, 4],
[5, 6, 7],
[8, 9, 10],
[11, 12, 13],
[14, 15, 16],
[17, 18, 19]]
有没有另一种方法可以做到这一点,而不需要对切片和相等大小进行混乱的计算,并且左键将每个项目弹出到列表列表中?
有numpy
解决方案吗?
也许array_split()
就是你想要的。
a = np.arange(20)
np.array_split(a, 6)