Question

I want to create a combination solver based on the a number the user decides to use and get all combinations of the rest of the loops for each item in the first loop, for example:

intNumberOfLoops = 3
lstLoopOne = ['loop01item01', 'loop01item02', 'loop01item03', 'loop01item04', 'loop0item05']

#Since we will be getting all combinations in relation to lstLoopOne, we will always need at #least one loop and thus we subtract it from intNumberOfLoops

if intNumberOfLoops < 2:
   print("Gotta put in more than 2 loops")
   exit()
for i in range(intNumberOfLoops-1):
   #create loops and same number of items as lstLoopOne dynamically for example:

   lstLoopTwo = ['loop02item01', 'loop02item02', 'loop02item03', 'loop0item04', 'loop0item05']
   lstLoopThree = ['loop03item01', 'loop03item02', 'loop03item03', 'loop03item04', 'loop03item05']

   #since we dont know how many loops the user wants to use at design-time, maybe we would have to use a list for lists??? But how would we get the list names which are based on the loop number and put it into a list of lists?

   #then run itertools.combinations on every item in the list of lists for example:

   for w in lstOfLists:
      #dynamicvariable = w.itertools.combinations
   #for every dynamic variable that was created by previod for:
      print(#all loop combinations in this case it would be for three loops:
      #loop01item01, loop02item01, loop03item01 <-iteration 01
      #loop01item01, loop02item01, loop03item02 <-iteration 02     
      #loop01item01, loop02item01, loop03item03 <-iteration 03
      #loop01item01, loop02item01, loop03item04 <-iteration 04
      #loop01item01, loop02item01, loop03item05 <-iteration 05
      ...
      #loop01item01, loop02item02, loop03item01 <-iteration n
      #loop01item01, loop02item02, loop03item02 <-iteration n+1
      ...
      #loop01item02, loop02item01, loop03item01 <-iteration t
      #loop01item02, loop02item01, loop03item02 <-iteration t+1
      #loop01item02, loop02item01, loop03item03 <-iteration t+2
      ...
      #loop01item02, loop02item02, loop03item01 <-iteration s
      #loop01item02, loop02item02, loop03item02 <-iteration s+1
      ...
Was it helpful?

Solution

Use itertools.product.

import itertools
lists = [
    ['loop01item01', 'loop01item02', 'loop01item03', 'loop01item04', 'loop0item05'],
    ['loop02item01', 'loop02item02', 'loop02item03', 'loop0item04', 'loop0item05'],
    ['loop03item01', 'loop03item02', 'loop03item03', 'loop03item04', 'loop03item05']
]

loops = int(raw_input("Enter the number of nested loops you want: "))
for elements in itertools.product(*lists[:loops]):
    print elements

Result:

Enter the number of nested loops you want: 3
('loop01item01', 'loop02item01', 'loop03item01')
('loop01item01', 'loop02item01', 'loop03item02')
('loop01item01', 'loop02item01', 'loop03item03')
('loop01item01', 'loop02item01', 'loop03item04')
('loop01item01', 'loop02item01', 'loop03item05')
...
('loop01item01', 'loop02item02', 'loop03item01')
('loop01item01', 'loop02item02', 'loop03item02')
...
('loop01item02', 'loop02item01', 'loop03item01')
('loop01item02', 'loop02item01', 'loop03item02')
('loop01item02', 'loop02item01', 'loop03item03')
...
('loop01item02', 'loop02item02', 'loop03item01')
('loop01item02', 'loop02item02', 'loop03item02')

Use permutations on the list indices, if you don't want any elements to share an index.

import itertools
lists = [
    ['loop01item01', 'loop01item02', 'loop01item03', 'loop01item04', 'loop0item05'],
    ['loop02item01', 'loop02item02', 'loop02item03', 'loop0item04', 'loop0item05'],
    ['loop03item01', 'loop03item02', 'loop03item03', 'loop03item04', 'loop03item05']
]

loops = int(raw_input("Enter the number of nested loops you want: "))
list_size = len(lists[0])
for indices in itertools.permutations(range(5), loops):
    elements = [lists[i][idx] for i, idx in enumerate(indices)]
    print elements
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top