【问题标题】:Generator for splitting list (sequence) in N chunks in Python用于在 Python 中以 N 个块分割列表(序列)的生成器
【发布时间】:2017-10-02 15:36:53
【问题描述】:
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 块并生成这些块的列表。

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

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

(最好不使用第三方库)

【问题讨论】:

  • 您是否尝试过使用range 并将块大小添加到每个步骤作为切片的结尾?比如for i in range(0, len(l), s) 然后yield l[i, i+s]
  • @arielnmz 假设您的意思是yield l[i : i+s]。这将返回 [1, 2] [3, 4] [5]s = 2
  • generate_chunks(l,4) 的输出应该是什么?
  • 每个 'yield' 应该返回一个长度为 4 的列表
  • @martineau 我也认为这不是重复的。简而言之,该问题接受 [(2,), (4,), (1, 3)] 作为分区,但这个问题不接受,因为 1 和 3 不连续。

标签: python list generator


【解决方案1】:

这是一个基于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]]

【讨论】:

  • @SergeBallesta 不,如果您阅读了问题,则不应该这样做,该函数需要返回的块数,因此您的示例不适合 4 块的输入
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2018-11-28
  • 2022-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多