【问题标题】:Python: finding all tuples with constrained elements that add up to a constantPython:查找所有带有约束元素的元组,这些元素加起来是一个常数
【发布时间】:2013-02-25 10:52:11
【问题描述】:

假设给定一个长度为 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 语句

【问题讨论】:

  • 你快到了。只要找到一种方法使其成为递归搜索,您就会对其进行概括!
  • 作为旁注。不要使用is 进行相等测试。数字没有坏处。但是如果你习惯了它,当你使用其他物体时它可能会咬你。
  • 更大的数字也可能不相同。

标签: python vector iteration combinations


【解决方案1】:

使用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))

虽然将product 对象直接转换为列表会更好(并且更通用)。

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]

【讨论】:

  • +1。击败我一纳秒。虽然您可以从可迭代对象中构造列表。
  • 这有帮助。但是,我仍然需要手动写下 n 个变量。是否可以遍历单个元组 x?
  • @Forzaa 我刚刚完成了那部分
  • 顺便说一句,我不小心在我的初始代码中遗漏了一个 if 语句。
  • 很好的答案。我本来打算发一个竞争的,但我就是不能!所以这里有一个提示:如果你说 range(min(k,i)+1) 而不是 range(i+1),当 k 相对于最大值较小时,通过尽早修剪解空间,你将获得巨大的加速。
猜你喜欢
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
相关资源
最近更新 更多