如何在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)

有没有办法做到这一点? 非常感谢自述文件。

我将尝试以一种说教的方式回答您的问题,而不提供完整的代码(正如您在上面的评论中所要求的那样)。

  1. 组合方法

直接的解决方案是只查看不同长度的数字数组的可能组合。遍历长度和组合,您可以检查这些元素的总和是否给出了您的解决方案。

您应该查看函数 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 子句以进行打印。

  1. 功能方法:

假设您要查找的函数定义为 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) 

编辑:

上述方法是问题的直接实现,并未针对性能进行优化。如果您的问题扩大,您可能有兴趣保存先前计算步骤的状态(动态方法)或在字典中缓存中间结果(记忆)。