将列表分成更小的列表

Pro*_*grX -1 python

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

nb_classes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
N = 3
Run Code Online (Sandbox Code Playgroud)

我想获得更小的N列表,具体取决于 的长度nb_classes和 的值N

例如,如果 的值为N3,我想要 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]
Run Code Online (Sandbox Code Playgroud)

第二个例子:

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]
Run Code Online (Sandbox Code Playgroud)

第三个例子:

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]
Run Code Online (Sandbox Code Playgroud)

谢谢。

Ada*_*ith 5

有一个简单的方法使用itertools.cycleanditertools.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)
Run Code Online (Sandbox Code Playgroud)

请注意,这会返回一个生成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]
Run Code Online (Sandbox Code Playgroud)