把一个表分成长度大致相等的N部分

2024-09-28 20:46:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在找像even_split(L, n)这样的东西,把L分成n部分。

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

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


Tags: 方法infrom元素列表fordefchunks
3条回答

这是一个可行的方法:

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

这就是^{}*的存在理由:

>>> import numpy as np
>>> print(*np.array_split(range(10), 3))
[0 1 2 3] [4 5 6] [7 8 9]
>>> print(*np.array_split(range(10), 4))
[0 1 2] [3 4 5] [6 7] [8 9]
>>> print(*np.array_split(range(10), 5))
[0 1] [2 3] [4 5] [6 7] [8 9]

*记入6号房间Zero Piraeus的贷方

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

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 xrange(n))

示例:

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

相关问题 更多 >