Skip to main content
 首页 » 编程设计

python之用于在 Python 中将列表(序列)拆分为 N 个 block 的生成器

2025年05月04日12lhb25

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]] 
# ... 

如何实现generate_chunks(list, n)?

本质上,generate_chunks 所做的是将 list 分成 n block ,并生成这些 block 的列表。

为了澄清,n 指的是 block 的数量,而不是 block 的长度。

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

(最好不使用第 3 方库)

请您参考如下方法:

这是一个 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)) 

例如:

>>> 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]]