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应该做什么)