2015-03-08 2 views
1

У меня есть 9 переменных a, b, c, d, e, f, g, h, i и I, зацикливая их внутри 9 для цикла от 0 до 9. Но диапазон может меняться.Python Уменьшить условное выражение

Я хочу, чтобы все их последовательности были abcdefghi, чтобы повторного числа не было.

Сейчас у меня есть это, ниже:

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) 

Есть 9! = 362880 из них,

Но как я могу уменьшить условное выражение? И что, если диапазоны для циклов for различны?

Заранее благодарен!

+0

взглянуть на модуль itertools, я думаю, что [ 'combinations'] (https: //docs.python .org/2/library/itertools.html # itertools.combinations) функция - это то, что вы ищете – mkrieger1

+0

Это перестановка. –

+0

Что вы пытаетесь проверить? В словах. Конечно, легко было сделать это. – will

ответ

2

Вы можете просто сделать это с помощью itertools модуля:

from itertools import permutations 

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

Я действительно искал способ уменьшить условное выражение, но я думаю, что этот способ тоже работает. Спасибо –

+0

Вы хотите, чтобы я добавил версию для цикла? –

+0

нет, но что, если домен для переменных не все от 0 до 9. Что я могу в этом случае? –

2
from itertools import permutations 

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

который дает

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 

, что если я хочу последовательность ABCDEFGHI таких Täht а, б , c, e, g - значение от 0 до 9, а d, f, h, i в диапазоне от 1 до 5

Это немного сложнее, но все же достижимо. Это проще подобрать значения в d..i первых:

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) 

который дает

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 

Для общего случая (т.е. Sudoku) вам нужно более общее решение - ограничение решатель как python-constraint (для вступления см. the python-constraint home page).

Тогда ваше решение начинает выглядеть

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)) 

, который дает

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 
+0

За исключением перестановки букв a через i. И я обычно стараюсь избегать переменной комбо, поскольку это противоречит всей вещи перестановки. –

+0

@MalikBrahimi: «Я хочу, чтобы все их последовательности были abcdefghi, так что нет повторного ** числа **» - я принял это, чтобы он хотел цифры. –

Смежные вопросы