使用特定总和迭代列表

时间:2016-01-21 17:45:41

标签: python math optimization

我想迭代所有长度为n的列表,其元素总和为2.您如何有效地执行此操作?对n = 10来说,这是一种非常低效的方法。最后我想为'n>做这个。 25' 。

n = 10
for L in itertools.product([-1,1], repeat = n):
    if (sum(L) == 2):
        print L #Do something with L

2 个答案:

答案 0 :(得分:7)

如果你有2个+1而不是-1,你只能得到2的解,所以对于n == 24

a_solution = [-1,]*11 + [1,]*13  

现在你可以使用itertools.permutations来获得这个

的每个排列
for L in itertools.permutations(a_solution): print L

使用itertools.combinations来消除重复可能会更快

for indices in itertools.combinations(range(24),11):
    a = numpy.ones(24)
    a[list(indices)] = -1
    print a

请注意,要获得2,列表必须是偶数长度

答案 1 :(得分:1)

一种方法是在剩余元素无法弥补目标总和时停止产品递归。

具体来说,此方法将您的itertools.product(...,repeat)拆分为递归生成器,该生成器根据当前列表元素的值更新目标总和,并在进一步递归之前检查生成的目标是否可实现:

def generate_lists(target, n):
  if(n <= 0):
    yield []
    return
  if(target > n or target < -n):
    return
  for element in [-1,1]:
    for list in generate_lists(target-element, n-1):
      yield list+[element]