Python:查找所有元组,这些元组的受约束元素相加为一个常量

Python:查找所有元组,这些元组的受约束元素相加为一个常量,python,vector,iteration,combinations,Python,Vector,Iteration,Combinations,假设给定一个长度为4的向量,最小值(0,0,0,0)和最大值(2,1,3,2)。我想找到这个范围内的所有整数向量,加起来,比如说,5 以下代码实现了以下功能: maxvalues = (2,1,3,2) k = 5 t = [] for x1 in range(maxvalues[0]+1): for x2 in range(maxvalues[1]+1): for x3 in range(maxvalues[2]+1): for x4 in r

假设给定一个长度为4的向量,最小值(0,0,0,0)和最大值(2,1,3,2)。我想找到这个范围内的所有整数向量,加起来,比如说,5

以下代码实现了以下功能:

maxvalues = (2,1,3,2)
k = 5
t = []
for x1 in range(maxvalues[0]+1):
    for x2 in range(maxvalues[1]+1):
        for x3 in range(maxvalues[2]+1):
             for x4 in range(maxvalues[3]+1):
                  if x1+x2+x3+x4 is k:
                      t.append((x1,x2,x3,x4))
然而,这段代码不能很好地推广到更大的向量,并且似乎有点低效。有人有好的方法来概括这一点吗


编辑:轻微错误,忘记了if语句

使用
itertools.product

from itertools import product

for x1, x2, x3, x4 in product(*(range(i+1) for i in maxvalues)):
    t.append((x1, x2, x3, x4))
尽管将
产品
对象直接转换为列表更好(更通用)

t = list(product(*(range(i+1) for i in maxvalues)))
如果包含
if
语句,它看起来会像这样

t = [i for i in product(*(range(i+1) for i in maxvalues)) if sum(i) == k]

你快到了。只要找到一种方法,使它成为一个递归的搜索,你将它推广!作为旁注。不要使用
is
进行相等性测试。数字没有坏处。但如果你习惯了,当你使用其他物体时,它可能会咬你。即使是相等的大数字也可能不相同。+1。比我快一纳秒。虽然你可以从iterable中构造列表,这很有帮助。然而,我仍然需要手动写下n个变量。有可能在一个元组x上进行迭代吗?@Forzaa我刚刚完成了那个部分,我在我的初始代码中意外地遗漏了一个if语句。顺便说一句,回答得很好。我本来想发布一个竞争对手的帖子,但我就是不能!所以这里有一个提示:如果你说
range(min(k,i)+1)
而不是
range(i+1)
,那么当k相对于maxvalue很小时,通过提前修剪解空间,你将获得巨大的加速。