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