我有一个任意长度的列表,我需要将它分成相同大小的块并对其进行操作.有一些明显的方法可以做到这一点,比如保留一个计数器和两个列表,当第二个列表填满时,将它添加到第一个列表并清空下一轮数据的第二个列表,但这可能非常昂贵.
我想知道是否有人对任何长度的列表都有一个很好的解决方案,例如使用生成器.
我一直在寻找有用的东西,itertools但我找不到任何明显有用的东西.但是可能会错过它.
我需要一个给出列表L和数字的算法N,返回一个N较小的列表列表,其中子列表是"平衡的".例子:
algo(range(1, 8), 3) -> [[1,2,3], [4,5], [6,7]]
algo(range(1, 6), 4) -> [[1,2], [3], [4], [5]]
algo(range(1, 12), 5) -> [[1,2,3], [4,5], [6,7], [8,9], [10, 11]]
Run Code Online (Sandbox Code Playgroud)
如您所见,算法应该"更喜欢"输出中的第一个列表.
我已经尝试了几个小时,但我无法找到一个很好的简洁算法.顺便说一句,这将在Python中实现,但它确实是我在此之后的算法.这不是家庭作业,这是一个网站,它将在三列(Django)的列表中显示内容.
我从freenode上的#python得到了最好的答案,如下:
def split_up(l, n):
q, r = divmod(len(l), n)
def division_point(i):
return i * q + min(i, r)
return [l[division_point(i):division_point(i+1)] for i in range(n)]
Run Code Online (Sandbox Code Playgroud)
不要问我为什么它有效.:)虽然我会给出最多票数的人给出正确答案.