我有一个从范围1到n的数字列表,我想把这些数字分成x个子列表,其中每个子列表包含的数字少于30个。子列表的数量是我所需要的最小数量,这取决于列表中的数字总数,因此,例如,如果我有68个子列表,那么至少需要3个子列表,至少在它们之间分配数字。我将如何分割它们,以便每个子列表在原始列表中有下一个数字,以获得如下输出
a = []
for i in range(68):
a.append(i)
#code
output:
[[1,6,7,12,13,18,19,24....][2,5,8,11,14,17,20,23....][3,4,9,10,15,16,21,22....]]
或者,如果我需要4个子列表,它就会像这样
output:
[[1,8,9,16,17....][2,7,10,15,18][3,6,11,14,19][4,5,12,13,20,21....]]
编辑:这与Splitting a python list into 4 sub-lists that are as even as possible的问题不完全相同,因为我不希望迭代在完成循环后返回开始。我希望它能像这样从头开始循环
[0,13,14,28,29,42,43,56,57]
[1,12,15,27,30,41,44,55,58]
[2,11,16,26,31,40,45,54,59]
[3,10,17,25,32,39,46,53,60]
[4,9,19,24,33,38,47,52,61]
[5,8,20,23,34,37,48,51,62]
[6,7,21,22,35,36,49,50,63,64]
发布于 2022-09-07 18:47:13
假设你有
N = 68 # Number of elements
M = 30 # Max list size
首先是分项清单的数目:
count = math.ceil(N / M)
或者,没有ceil
count = (N + M - 1) // M
放置range(N)
每个元素的方式如下所示:
0, 1, 2, ..., count - 1, count - 1, count - 2, ..., 1, 0, 0, 1, 2, ...
每个count
元素,您都翻转顺序。这样您就可以翻转每个count
元素:
subs = [[] for _ in range(count)]
for i in range(N):
index = i % count
if (i // count) % 2:
index = count - index - 1
subs[index].append(i + 1)
您也可以用另一种方式来看待它:子列表中元素的模式是(最多是一些偏移量):
1, 2 * count, 2 * count + 1, 4 * count, 4 * count + 1, 6 * count, ...
您可以将其表示为嵌套列表理解:
subs = [[j + (count - i if (j // count) % 2 else i + 1) for j in range(0, N - i, count)] for i in range(count)]
发布于 2022-09-07 18:44:49
对于三个子列表,sublists = [[], [], []]
sublists2
为了使它成为n个子列表的泛型:
sublists = [[] for _ in range(n)]
https://stackoverflow.com/questions/73639908
复制相似问题