# How To Filter Elements Of Cartesian Product Following Specific Ordering Conditions

## 03 April 2019 - 1 answer

I have to generate multiple reactions with different variables. They have 3 elements. Let's call them `B`, `S` and `H`. And they all start with `B1`. `S` can be appended to the element if there is at least one `B`. So it can be `B1S1` or `B2S2` or `B2S1` etc... but not `B1S2`. The same goes for `H`. `B1S1H1` or `B2S2H1` or `B4S1H1` but never `B2S2H3`. The final variation would be `B5S5H5`. I tried with `itertools.product`. But I don't know how to get rid of the elements that don't match my condition and how to add the next element. Here is my code:

``````import itertools

a = list(itertools.product([1, 2, 3, 4], repeat=4))

#print (a)

met = open('random_dat.dat', 'w')
met.write('Reactions')
met.write('\n')
for i in range(1,256):
met.write('\n')
met.write('%s: B%sS%sH%s -> B%sS%sH%s' %(i, a[i], a[i], a[i], a[i], a[i], a[i]))
met.write('\n')
met.close()
``````

Simple for loops will do what you want:

``````bsh = []
for b in range(1,6):
for s in range(1,b+1):
for h in range(1,b+1):
bsh.append( f"B{b}S{s}H{h}" )

print(bsh)
``````

Output:

``````['B1S1H1', 'B2S1H1', 'B2S1H2', 'B2S2H1', 'B2S2H2', 'B3S1H1', 'B3S1H2', 'B3S1H3',
'B3S2H1', 'B3S2H2', 'B3S2H3', 'B3S3H1', 'B3S3H2', 'B3S3H3', 'B4S1H1', 'B4S1H2',
'B4S1H3', 'B4S1H4', 'B4S2H1', 'B4S2H2', 'B4S2H3', 'B4S2H4', 'B4S3H1', 'B4S3H2',
'B4S3H3', 'B4S3H4', 'B4S4H1', 'B4S4H2', 'B4S4H3', 'B4S4H4', 'B5S1H1', 'B5S1H2',
'B5S1H3', 'B5S1H4', 'B5S1H5', 'B5S2H1', 'B5S2H2', 'B5S2H3', 'B5S2H4', 'B5S2H5',
'B5S3H1', 'B5S3H2', 'B5S3H3', 'B5S3H4', 'B5S3H5', 'B5S4H1', 'B5S4H2', 'B5S4H3',
'B5S4H4', 'B5S4H5', 'B5S5H1', 'B5S5H2', 'B5S5H3', 'B5S5H4', 'B5S5H5']
``````

Thanks to @mikuszefski for pointing out improvements.