用于在Python中的N个块中拆分列表(序列)的生成器

Scr*_*tim 1 python list generator

for i in generate_chunks([1, 2, 3, 4, 5], 2):
    print(i)

# [[1], [2, 3, 4, 5]]
# [[1, 2], [3, 4, 5]]
# [[1, 2, 3], [4, 5]]
# [[1, 2, 3, 4], [5]]


for i in generate_chunks([1, 2, 3, 4, 5], 3):
    print(i)

# [[1], [2], [3, 4, 5]]
# [[1, 2], [3], [4, 5]]
# [[1, 2, 3], [4], [5]]
# [[1, 2], [3, 4], [5]]
# ...
Run Code Online (Sandbox Code Playgroud)

我该如何实施generate_chunks(list, n)

本质上讲generate_chunks确实是分裂listn块,并产生这些块的列表.

为了澄清,n指的是块的数量,而不是块的长度.

产生这些块列表的顺序是无关紧要的,但是初始列表中元素的顺序很重要,因此对于给定列表[1, 2, 3],结果[[1], [2, 3]]将是有效的,而[[1], [3, 2]无效.

(最好不使用第三方库)

Joh*_*man 7

这是一种itertools基于方法的方法:

import itertools

def chunks(items, cutpoints):
    return [items[i:j] for i,j in zip([0] + cutpoints, cutpoints + [len(items)])]

def generate_chunks(items, n):
    indices = range(1,len(items))
    for cutpoints in itertools.combinations(indices,n-1):
        yield chunks(items,list(cutpoints))
Run Code Online (Sandbox Code Playgroud)

例如:

>>> for c in generate_chunks([1,2,3,4,5],4): print(c)

[[1], [2], [3], [4, 5]]
[[1], [2], [3, 4], [5]]
[[1], [2, 3], [4], [5]]
[[1, 2], [3], [4], [5]]
Run Code Online (Sandbox Code Playgroud)