首页 > 解决方案 > Python分区函数

问题描述

我有以下代码,我改编自之前发布在本网站上的代码。它是 a 分区函数的一种变体,它输出所有可能的数字组合,这些数字的总和相加为指定的总和,但它将可用于总和的数字限制为有限的输入列表。

def part(nr, Nums):
    nrs = sorted(Nums, reverse=True)

    def inner(n, i):
        if n == 0:
            yield []
        for k in range(i, len(nrs)):
            if nrs[k] <= n:
                for rest in inner(n - nrs[k], k):
                    yield [nrs[k]] + rest

    return list(inner(nr, 0))


#List of numbers to form the sums.
Nums = [5,6 ,7 ,8, 9, 10]

#the total that the numbers add up to.
total = 32

tr = part(total, Nums)

print(f"{len(tr)}  Combination of {Nums} in {total} are:")
print(tr)

结果:

24 [5, 6, 7, 8, 9, 10] 在 32 中的组合是:

[[10, 10, 7, 5], [10, 10, 6, 6], [10, 9, 8, 5], [10, 9, 7, 6], [10, 8, 8, 6] , [10, 8, 7, 7], [10, 7, 5, 5, 5], [10, 6, 6, 5, 5], [9, 9, 9, 5], [9, 9, 8, 6], [9, 9, 7, 7], [9, 8, 8, 7], [9, 8, 5, 5, 5], [9, 7, 6, 5, 5], [ 9, 6, 6, 6, 5], [8, 8, 8, 8], [8, 8, 6, 5, 5], [8, 7, 7, 5, 5], [8, 7, 6, 6, 5], [8, 6, 6, 6, 6], [7, 7, 7, 6, 5], [7, 7, 6, 6, 6], [7, 5, 5, 5, 5, 5], [6, 6, 5, 5, 5, 5]]

进程以退出代码 0 结束

一切都按预期工作,但我想更改它,以便每个数字在每个可能的组合中只能使用一次或根本不使用。

例如:“[10, 8, 7, 7], [10, 7, 5, 5, 5]” 这些组合和将不会被输出,因为它们分别包含重复的 7 和 5。

我试图保留生成器函数,因为有人告诉我它们比列表具有更好的性能,并且将来我可能会为更大的列表和总和使用相同的函数。但我不确定如何检查生成器是否有重复数字以消除包含重复数字的子列表。

谢谢。

标签: pythongeneratorpartition

解决方案


您可以将第 7 行更改为:for k in range(i + 1, len(nrs)):


推荐阅读