我具有以下代码,这些代码是我根据以前在此网站上发布的代码改编而成的。它是分区函数的一种变体,它输出所有可能的数字组合,这些数字加起来等于指定的总和,但是它将可用于总和的数字限制为有限的输入列表。
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,因此不会输出。
我正在尝试保留生成器函数,因为有人告诉我它们的性能比列表更好,并且将来我可能会对更大的列表和总和使用相同的函数。但是我不确定如何检查生成器中是否存在重复编号,以消除包含重复编号的子列表。
谢谢。
答案 0 :(得分:0)
您可以将第7行更改为:for k in range(i + 1, len(nrs)):