Python 用特定的和迭代列表

Python 用特定的和迭代列表,python,math,optimization,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 一种方法是在剩余元素不能构成目标和时停止乘积递归 具体来说,此方法将把您的itertools.product(…,repeat)分

我想迭代所有长度
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

一种方法是在剩余元素不能构成目标和时停止乘积递归

具体来说,此方法将把您的
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]
def生成_列表(目标,n):
如果(n或目标<-n):
返回
对于[-1,1]中的元素:
对于生成_列表中的列表(目标元素,n-1):
收益表+[要素]

只有当n==24时+1多于-1时,才能得到2的解

a_solution = [-1,]*11 + [1,]*13  
现在,您可以使用itertools.permutations来获得这个函数的每个置换

for L in itertools.permutations(a_solution): print L
使用itertools.compositions消除重复可能会更快

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

注意:要得到2,列表必须是偶数长度

元素值是否可以是
1
-1
?@lambo477是的。
itertools。排列
仍然会产生大量重复项。最好使用
itertools.compositions
为-1选择11个位置。请注意,应该是
itertools.compositions(xrange(n),n//2-1)
,然后将-1放在所选位置。我们不会把
组合称为
解决方案。。。现在我要打开一个python解释器,一般来说,给定一个偶数
n
(>=2):
a_解决方案=[-1]*(n//2-1)+[1]*(n//2+1)
(另外,您可能应该使用25.11+13=24以外的数字。我们这里需要偶数长度。)我想您想要的是
,而不是
。。。此外,这几乎肯定会超过pythons递归堆栈限制(+1,因为它可以很好地处理较小的列表…它从概念上很好地解释了OP应该做什么)