将一个列表拆分成长度相等的部分

2024-04-19 04:48:44 发布

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

我需要一个算法,它给定一个列表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]]

如您所见,算法应该“偏好”输出中的第一个列表。在

我已经试了好几个小时了,但是我找不到一个好的简洁的算法。顺便说一句,这将在Python中实现,但这确实是我在这里所追求的算法。这是不是家庭作业,这是一个网站,它将在三列列表中显示内容(Django)。在


我从#python on freenode得到了最好的答案,如下所示:

^{pr2}$

不过,别问我为什么有用。:)不过,我会给票数最多的人一个正确的答案。在


Tags: django答案算法示例内容列表网站on
3条回答

假设您希望输出尽可能包含长度相等的列表,否则优先选择开头的列表。子列表长度之差不超过一个。在

>>> l = [0, 1, 2, 3, 4, 5, 6]
>>> def algo(li, n):
        a, b = divmod(len(li), n)
        c = [a + 1] * b + [a] * (n-b)
        s = 0
        for i, j in enumerate(c):
            c[i] = li[s:s+j]
            s += j
        return c

>>> algo(l, 3)
[[0, 1, 2], [3, 4], [5, 6]]
>>> algo(l, 4)
[[0, 1], [2, 3], [4, 5], [6]]

这是我想出的代码,没有分类。只是在第一排序()如果输入未排序。在

我认为这个结果很好,使用迭代器并使用islice截断下一个部分。在

import itertools

def partlst(lst, n):
    """Partition @lst in @n balanced parts, in given order"""
    parts, rest = divmod(len(lst), n)
    lstiter = iter(lst)
    for j in xrange(n):
        plen = len(lst)/n + (1 if rest > 0 else 0)
        rest -= 1
        yield list(itertools.islice(lstiter, plen))

parts =  list(partlst(range(1, 15), 5))
print len(parts)
print parts

如果我理解你的问题。。。你只需要为mod(n)下的每个列表添加一项,其中有algo(范围(a,b),n)

所以你应该:

  1. 有b-a>;n
  2. 计算b-a=n*x+y(我真的不知道python上是否存在运算符%,所以应该得到y)
  3. 第一个y列表将具有(b-a/n+1)个元素,其他列表将具有(b-a/n)

相关问题 更多 >