将列表拆分为长度大致相等的 N 部分

新手上路,请多包涵

将列表分成 大致 相等的部分的最佳方法是什么?例如,如果列表有 7 个元素并将其拆分为 2 个部分,我们希望在一个部分中获取 3 个元素,而另一个应该有 4 个元素。

我正在寻找类似 even_split(L, n) 的东西,它将 L 分解为 n 部件。

 def chunks(L, n):
    """ Yield successive n-sized chunks from L.
    """
    for i in range(0, len(L), n):
        yield L[i:i+n]

上面的代码给出了 3 个块,而不是 3 个块。我可以简单地转置(迭代它并获取每列的第一个元素,调用该部分,然后获取第二个并将其放入第二部分,等等),但这会破坏项目的顺序。

原文由 user248237 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 586
2 个回答

由于舍入错误,此代码已损坏。不要使用它!!!

 assert len(chunkIt([1,2,3], 10)) == 10  # fails


这是一个可行的方法:

 def chunkIt(seq, num):
    avg = len(seq) / float(num)
    out = []
    last = 0.0

    while last < len(seq):
        out.append(seq[int(last):int(last + avg)])
        last += avg

    return out

测试:

 >>> chunkIt(range(10), 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]]
>>> chunkIt(range(11), 3)
[[0, 1, 2], [3, 4, 5, 6], [7, 8, 9, 10]]
>>> chunkIt(range(12), 3)
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

原文由 Max Shawabkeh 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以相当简单地将其编写为列表生成器:

 def split(a, n):
    k, m = divmod(len(a), n)
    return (a[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n))

例子:

 >>> list(split(range(11), 3))
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]

原文由 tixxit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题