Iterate over lists with a certain amount

I would like to iterate over all length lists nwhose elements are summed up to 2. How can you do this efficiently? Here is a very inefficient method for n = 10. Ultimately, I would like to do this for `n> 25 '.

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

you can only have solution 2 if you have 2 more +1 than -1, so for n == 24

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

now you can just use itertools.permutations to get every permutation of this

for L in itertools.permutations(a_solution): print L

it would probably be faster to use itertools.combinations to eliminate duplicates

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

note that to get 2 the list must be even length

+7

- , .

, 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]
+1

Source: https://habr.com/ru/post/1625374/


All Articles