python - 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。
我试图保留生成器函数,因为有人告诉我它们比列表具有更好的性能,并且将来我可能会为更大的列表和总和使用相同的函数。但我不确定如何检查生成器是否有重复数字以消除包含重复数字的子列表。
谢谢。
解决方案
您可以将第 7 行更改为:for k in range(i + 1, len(nrs)):
推荐阅读
- maven - 在springboot中,我不能排除嵌入式tomcat
- python - Python:ctypes加载的dll是否共享相同的内存空间
- javascript - 有没有办法在一个页面上加载多个谷歌翻译小部件
- python - Django:一起使用位置参数和关键字参数
- javascript - 错误:“DataSnapshot”类型上不存在属性“getChildren”
- angular - 检查嵌入内容的插槽是否为空
- python - 根据一组值检查相等性
- c++ - 在视觉工作室中构建代码时,我面临错误,.h 文件丢失
- c - ffmpeg c api中的av_register_all()与avcodec_register_all()有什么区别?
- javascript - 如何从 javascript 中的变量创建对象属性?