Ohhh
Ohhh

Reputation: 435

Python Reduce conditional expression

I have 9 variables a,b,c,d,e,f,g,h,i and I loop them inside 9 for loop from 0 to 9. But the range may vary.

I want all sequences of them abcdefghi, such that there is no repeated number.

Right now I have this, below:

for a in range(0, 9): 
    for b in range(0,9): #it doesn't have to start from 0
    ....
        for i in range(0, 9):
             if a != b and a != c ... a != i
                b != c and b != d ... b != i
                c != d and c != e ... c != i
                ... h != i:

                print (a,b,c,d,e,f,g,h,i)

There are 9! = 362880 of them,

But how can I reduce the conditional expression? And what if the ranges for the for loops are different?

Thanks in advance!

Upvotes: 1

Views: 957

Answers (2)

Hugh Bothwell
Hugh Bothwell

Reputation: 56694

from itertools import permutations

for perm in permutations(range(1, 10), 9):
    print(" ".join(str(i) for i in perm))

which gives

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 8 7 9
1 2 3 4 5 6 8 9 7
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 9 8 7

# ... etc - 9! = 362880 permutations

what if i want sequence of abcdefghi such taht a,b,c,e,g is value from 0 to 9, and d,f,h,i in the range of 1 to 5

This is a bit more complicated, but still achievable. It is easier to pick the values in d..i first:

from itertools import permutations

for d,f,h,i,unused in permutations([1,2,3,4,5], 5):
    for a,b,c,e,g in permutations([unused,6,7,8,9], 5):
        print(a,b,c,d,e,f,g,h,i)

which gives

5 6 7 1 8 2 9 3 4
5 6 7 1 9 2 8 3 4
5 6 8 1 7 2 9 3 4
5 6 8 1 9 2 7 3 4
5 6 9 1 7 2 8 3 4
5 6 9 1 8 2 7 3 4
5 7 6 1 8 2 9 3 4
5 7 6 1 9 2 8 3 4
5 7 8 1 6 2 9 3 4
5 7 8 1 9 2 6 3 4

# ... etc - 5! * 5! = 14400 permutations

For the general case (ie Sudoku) you need a more general solution - a constraint solver like python-constraint (for intro see the python-constraint home page).

Then your solution starts to look like

from constraint import Problem, AllDifferentConstraint

p = Problem()
p.addVariables("abceg", list(range(1,10)))
p.addVariables("dfhi",  list(range(1, 6)))
p.addConstraint(AllDifferentConstraint())

for sol in p.getSolutionIter():
    print("{a} {b} {c} {d} {e} {f} {g} {h} {i}".format(**sol))

which gives

9 8 7 4 6 3 5 2 1
9 8 7 4 5 3 6 2 1
9 8 6 4 7 3 5 2 1
9 8 6 4 5 3 7 2 1
9 8 5 4 6 3 7 2 1
9 8 5 4 7 3 6 2 1
9 7 8 4 5 3 6 2 1
9 7 8 4 6 3 5 2 1
9 7 6 4 8 3 5 2 1
9 7 6 4 5 3 8 2 1
9 7 5 4 6 3 8 2 1

# ... etc - 14400 solutions

Upvotes: 2

Malik Brahimi
Malik Brahimi

Reputation: 16721

You can simply do this with the itertools module:

from itertools import permutations

for arrangement in permutations('abcdefghi', 9):
    print ''.join(arrangement)

Upvotes: 2

Related Questions