我正在尝试编写一个可以将列表分成更小的列表的代码,如下所示,我有一个列表和一个类似的值:
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)
谢谢。
有一个简单的方法使用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)