将列表分成更小的列表

  • 本文关键字:列表 python
  • 更新时间 :
  • 英文 :


我正在尝试编写一个代码,可以将列表划分为更小的列表,如下所示,我有一个列表和一个类似的值:

nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
N = 3

我想得到更小的N列表,这取决于nb_classes的长度和N的值。

例如,如果N的值是3,我希望有3个类似的小列表:

nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list_1 = [1,2,3]
list_2 = [4,5,6]
list_3 = [7,8,9]

第二个例子:

nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list_1 = [1,2,3,4]
list_2 = [5,6,7]
list_3 = [8,9,10]

第三个例子:

nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
list_1 = [1,2,3,4]
list_2 = [5,6,7,8]
list_3 = [9,10,11]

谢谢。

使用itertools.cycleitertools.islice有一种简单的方法

import itertools
def split_list(lst, n=3):
lengths = [0 for _ in range(n)]
# set the lengths of each sublist correctly
for _, idx in zip(range(len(lst)), itertools.cycle(range(n))):
lengths[idx] += 1
iterator = iter(lst)
for length in lengths:
yield itertools.islice(iterator, length)

请注意,这将返回一个生成islice对象的生成器表达式,这些对象本身就是迭代器而不是列表。如果您实际上需要这里的列表,您必须自己制作。

import itertools  # as before
def split_list(lst):
# as before, until...
iterator = iter(lst)
# instead of the for loop leading to the yield, instead use...
return [list(itertools.islice(iterator, length)) for length in lengths]

所以,我几乎没有尝试在一行中完成它。以下是我使用的结果

import math
nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
N = 3
lists = [nb_classes[math.ceil(i): math.ceil(i + len(nb_classes) / N)] for i in (len(nb_classes) / N * j for j in range(N))]
print(lists)  # [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11]]

但这可能有点复杂,你只需要接收你的索引

除法得到商和余数。正常的子列表长度是q,但第一个r子列表得到一个额外的元素:

def divide(lst, N):
q, r = divmod(len(lst), N)
i = 0
return [lst[i : (i := i + q + (j < r))]
for j in range(N)]

这是我的解决方案:

def splitlist(mylist: list,n: int):
lst = mylist
res_list = []
while lst:
if len(lst) < n:
# Not sure if the ValueError is approptiate
raise ValueError()
if len(lst) % n == 0:
slice_at_idx = n
else:
# next slice will be n+1 size (4 in your case)
slice_at_idx = n+1
res_list.append(lst[:(slice_at_idx)])
lst = lst[(slice_at_idx):]

return res_list


nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
N = 3
print(splitlist(nb_classes,N))
nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
# if you know the resulting amount of lists
lst_1,lst_2,lst_3 = splitlist(nb_classes,N)

最新更新