如何在python中做出特定的组合?
How make a especific combinations in python?
我正在尝试进行特定组合,以便通过添加以下规格使其加起来为“4”:
a+a+a+a+a+a+a+a = 0.5 per/unit = (In total it sum:) 4
b+b+b+b = 1 per/unit = (In total it sum:) 4
c+c = 2 per/unit = (In total it sum:) 4
这样我想知道结果并在屏幕上打印组合:
a+a+a+a+a+a+a+a = 4
a+a+a+a+a+a+b = 4
a+a+a+a+b+b = 4
a+a+b+b+b = 4
a+a+a+a+a+a+c = 4
a+a+b+c = 4
a+a+c+b = 4
b+a+a+a+a+a+a = 4
b+b+a+a+a+a = 4
b+b+b+a+a = 4
b+b+c = 4
b+c+a+a = 4
b+a+c = 4
b+c+a = 4
c+a+a+a+a = 4
c+b+a+a = 4
c+a+a+b = 4
我的代码:
from itertools import combinations
numbers=[2,4,8]
for c in combinations(numbers, 3):
print(c)
有没有办法做到这一点?
非常感谢自述文件。
我将尝试以一种说教的方式回答您的问题,而不提供完整的代码(正如您在上面的评论中所要求的那样)。
- 组合方法
直接的解决方案是只查看不同长度的数字数组的可能组合。遍历长度和组合,您可以检查这些元素的总和是否给出了您的解决方案。
您应该查看函数 itertools.combinations_with_replacement
,因为它允许每个元素多次出现。
from itertools import combinations_with_replacement
numbers=[2,4,8]
for length in [3]:
for c in combinations_with_replacement(numbers, length):
print(c, f"sum {sum(c)}")
> (2, 2, 2) sum 6
> (2, 2, 4) sum 8
> (2, 2, 8) sum 12
> (2, 4, 4) sum 10
> (2, 4, 8) sum 14
> (2, 8, 8) sum 18
> (4, 4, 4) sum 12
> (4, 4, 8) sum 16
> (4, 8, 8) sum 20
> (8, 8, 8) sum 24
您必须相应地指定长度数组并添加一个 if 子句以进行打印。
- 功能方法:
假设您要查找的函数定义为 def calcComb(sum,numbers): ...
其中 returns 您尝试过的一串组合。
此问题的典型函数式解决方案是递归调用一个内部函数 rec(sumRest,numRest,textComb)
,该函数跟踪您构建的总和以及您正在测试的组合(此处为字符串格式)。骨骼结构类似于:
def rec(sumRest,numRest,textComb):
if ... : return ...
elif ... : return ...
else :
newText = ...
return rec(sumRest-numRest[0],numRest,textComb+newText)
+ rec(sumRest,numRest[1:],textComb)
编辑:
上述方法是问题的直接实现,并未针对性能进行优化。如果您的问题扩大,您可能有兴趣保存先前计算步骤的状态(动态方法)或在字典中缓存中间结果(记忆)。
我正在尝试进行特定组合,以便通过添加以下规格使其加起来为“4”:
a+a+a+a+a+a+a+a = 0.5 per/unit = (In total it sum:) 4
b+b+b+b = 1 per/unit = (In total it sum:) 4
c+c = 2 per/unit = (In total it sum:) 4
这样我想知道结果并在屏幕上打印组合:
a+a+a+a+a+a+a+a = 4
a+a+a+a+a+a+b = 4
a+a+a+a+b+b = 4
a+a+b+b+b = 4
a+a+a+a+a+a+c = 4
a+a+b+c = 4
a+a+c+b = 4
b+a+a+a+a+a+a = 4
b+b+a+a+a+a = 4
b+b+b+a+a = 4
b+b+c = 4
b+c+a+a = 4
b+a+c = 4
b+c+a = 4
c+a+a+a+a = 4
c+b+a+a = 4
c+a+a+b = 4
我的代码:
from itertools import combinations
numbers=[2,4,8]
for c in combinations(numbers, 3):
print(c)
有没有办法做到这一点? 非常感谢自述文件。
我将尝试以一种说教的方式回答您的问题,而不提供完整的代码(正如您在上面的评论中所要求的那样)。
- 组合方法
直接的解决方案是只查看不同长度的数字数组的可能组合。遍历长度和组合,您可以检查这些元素的总和是否给出了您的解决方案。
您应该查看函数 itertools.combinations_with_replacement
,因为它允许每个元素多次出现。
from itertools import combinations_with_replacement
numbers=[2,4,8]
for length in [3]:
for c in combinations_with_replacement(numbers, length):
print(c, f"sum {sum(c)}")
> (2, 2, 2) sum 6
> (2, 2, 4) sum 8
> (2, 2, 8) sum 12
> (2, 4, 4) sum 10
> (2, 4, 8) sum 14
> (2, 8, 8) sum 18
> (4, 4, 4) sum 12
> (4, 4, 8) sum 16
> (4, 8, 8) sum 20
> (8, 8, 8) sum 24
您必须相应地指定长度数组并添加一个 if 子句以进行打印。
- 功能方法:
假设您要查找的函数定义为 def calcComb(sum,numbers): ...
其中 returns 您尝试过的一串组合。
此问题的典型函数式解决方案是递归调用一个内部函数 rec(sumRest,numRest,textComb)
,该函数跟踪您构建的总和以及您正在测试的组合(此处为字符串格式)。骨骼结构类似于:
def rec(sumRest,numRest,textComb):
if ... : return ...
elif ... : return ...
else :
newText = ...
return rec(sumRest-numRest[0],numRest,textComb+newText)
+ rec(sumRest,numRest[1:],textComb)
编辑:
上述方法是问题的直接实现,并未针对性能进行优化。如果您的问题扩大,您可能有兴趣保存先前计算步骤的状态(动态方法)或在字典中缓存中间结果(记忆)。