Python分区功能

时间:2018-11-13 05:01:22

标签: python generator partition

我具有以下代码,这些代码是我根据以前在此网站上发布的代码改编而成的。它是分区函数的一种变体,它输出所有可能的数字组合,这些数字加起来等于指定的总和,但是它将可用于总和的数字限制为有限的输入列表。

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个32中的[5、6、7、8、9、10]的组合是:

[[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,因此不会输出。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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