Python 按累计大小对项目列表进行分组,并限制组的大小

Python 按累计大小对项目列表进行分组,并限制组的大小,python,algorithm,Python,Algorithm,我正试图找到一种方法,将[名称、大小]对组合在一起。我们的想法是将它们组合在一起,使每组尽可能接近最大组大小,但不破坏最大组长度截止值 例如,如果maximum\u group\u size=10,并且maximum\u group\u length=3,则以下简单数据集可以按如下方式分组: data = [['A', 3], ['B', 6], ['C', 7], ['D', 1]] grouped: [[['A', 3], ['B', 6]], [['C', 7], ['D', 1]]]

我正试图找到一种方法,将
[名称、大小]
对组合在一起。我们的想法是将它们组合在一起,使每组尽可能接近
最大组大小
,但不破坏
最大组长度
截止值

例如,如果
maximum\u group\u size=10
,并且
maximum\u group\u length=3
,则以下简单数据集可以按如下方式分组:

data = [['A', 3], ['B', 6], ['C', 7], ['D', 1]]
grouped: [[['A', 3], ['B', 6]], [['C', 7], ['D', 1]]]
但该数据集最终将成为:

data = [['A', 1], ['B', 1], ['C', 1], ['D', 1]]
grouped: [[['A', 1], ['B', 1], ['C', 1]], ['D', 1]]]
输入数据未排序,但可以轻松排序。我的直觉是不这样做,因为排序会导致最大数量的组未满

我怎么能(漂亮地)这样做呢?我当前的实现不是很优雅:

def group_references(sam_handle, num_bases=10 ** 7, max_seqs=100):
    """
    Group up references by num_bases, unless that exceeds max_seqs.
    """
    name_iter = itertools.izip(*[sam_handle.references, sam_handle.lengths])
    name, size = name_iter.next()
    this_bin = [[name, size]]
    bin_base_count = size
    num_seqs = 1
    for name, size in name_iter:
        bin_base_count += size
        num_seqs += 1
        if bin_base_count >= num_bases or num_seqs > max_seqs:
            yield this_bin
            this_bin = [[name, size]]
            bin_base_count = size
            num_seqs = 1
        else:
            this_bin.append([name, size])

你可以证明,如果你能在多项式时间内最优地解决这个问题,你也能在多项式时间内解决背包问题,这是不可能的。因此,解是非多项式的

无论如何,我建议大家看看背包问题的各种近似解,然后选择一个最适合你的问题。

你的问题是or


看一看python中的代码。

在第一个示例数据集中,第一个组大小是3+9=12,大于最大组大小10。在你的例子中,这是一个拼写错误吗?那是一个拼写错误,对不起。本来应该是6的。修复了第二个示例组中的IANFIDES长度为4(>最大组长度=3)