将清单大致等份的最佳方法是什么?例如,如果列表有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个块。我可以简单地转置(遍历这个,取每列的第一个元素,称之为第一部分,然后取第二个元素,把它放在第二部分,等等),但这破坏了项目的顺序。
如果你把n个元素分成大约k个块,你可以让n % k个块1个元素比其他块大,以分配额外的元素。
下面的代码将给出块的长度:
[(n // k) + (1 if i < (n % k) else 0) for i in range(k)]
示例:n=11, k=3结果为[4,4,3]
然后你可以很容易地计算块的起始索引:
[i * (n // k) + min(i, n % k) for i in range(k)]
示例:n=11, k=3结果为[0,4,8]
使用第i+1块作为边界,我们得到列表l的第i块(len n)是
l[i * (n // k) + min(i, n % k):(i+1) * (n // k) + min(i+1, n % k)]
作为最后一步,使用列表理解从所有块创建一个列表:
[l[i * (n // k) + min(i, n % k):(i+1) * (n // k) + min(i+1, n % k)] for i in range(k)]
示例:n=11, k=3, l=range(n) results in [range(0,4), range(4,8), range(8,11)]