2014-10-19 4 views
0

Я пишу программу, чтобы проверить, разрешено судоку. Вот часть, о которой я не могу думать о способе рефакторе:Как я могу реорганизовать эту строку кода:

for i in range(0, 9): 
    for j in range(0, 9): 
     if i < 3: 
      if j < 3: 
       one.append(sudoku[i][j]) 
      if j >= 3 and j < 6: 
       two.append(sudoku[i][j]) 
      if j >= 6: 
       three.append(sudoku[i][j]) 
     if i >= 3 and i < 6: 
      if j < 3: 
       four.append(sudoku[i][j]) 
      if j >= 3 and j < 6: 
       five.append(sudoku[i][j]) 
      if j >= 6: 
       six.append(sudoku[i][j]) 
     if i >= 6: 
      if j < 3: 
       seven.append(sudoku[i][j]) 
      if i >= 6 and j >= 3 and j < 6: 
       eight.append(sudoku[i][j]) 
      if j >= 6: 
       nine.append(sudoku[i][j])  

Спасибо!

ответ

2

Попробуйте использовать 2D массив для хранения ваших объектов и сопоставить их следующим образом:

mapping = [[one, two, three], [four, five, six], [seven, eight, nine]] 

for i in range(0, 9): 
    for j in range(0, 9): 
     square = mapping[i/3][j/3] 
     square.append(sudoku[i][j]) 

Если вы используете Python 3, вы бы заменить square = mapping[i/3][j/3] с square = mapping[int(i/3)][int(j/3)] или square = mapping[i//3][j//3] Падраик отметил

В причина в том, что Python2 округляет и возвращает int для деления, где Python3 вернет float. Кастинг до int будет округлен.

+2

Почему не 'i // 3' для python3? –

+0

Потому что я не знал, что это можно сделать;) – Parker

+0

ну первый раз на все;) –

1

Поместите все свои блоки one, two и т. Д. В массив. Затем выберите правый блок в массиве, в зависимости от i и j. В принципе, вы хотите этот показатель:

index = (i/3) * 3 + j/3 

Где вы делаете целочисленное деление.

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