2016-06-21 7 views
-2

Так что, в основном, я пытаюсь использовать Python 3 для создания решения sudoku путем реализации backtracking как учебного проекта, поэтому я пока не буду совершенной эффективности (я собираюсь переписать его потом, чтобы попытаться получить его лучше, у меня есть избыточные переменные и другие случайные вещи), просто заставляя его работать. Однако, пока я работаю над этим, отладка становится проблемой, и я хочу отформатировать сетку, которую я использую лучше, поскольку она идет, но я действительно не знаю, как это сделать. Это, как я сейчас хранить его:Формирование сетей Sudoku Python 3

grid = [ 
[4, 0, 0, 0, 0, 5, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 1, 9, 8], 
[3, 0, 0, 0, 8, 2, 4, 0, 0], 
[0, 0, 0, 1, 0, 0, 0, 8, 0], 
[9, 0, 3, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 3, 0, 6, 7, 0], 
[0, 5, 0, 0, 0, 9, 0, 0, 0], 
[0, 0, 0, 2, 0, 0, 9, 0, 7], 
[6, 4, 0, 3, 0, 0, 0, 0, 0], 
] 

Но я хочу, чтобы вывести его в таком роде формат:

------------------------------------- 
| 4   |   5 |   | 
| + + + + + + + + | 
|   |   | 1 9 8 | 
| + + + + + + + + | 
| 3   |  8 2 | 4   | 
|---+---+---+---+---+---+---+---+---| 
|   | 1   |  8  | 
| + + + + + + + + | 
| 9  3 |   |   | 
| + + + + + + + + | 
|   |  3  | 6 7  | 
|---+---+---+---+---+---+---+---+---| 
|  5  |   9 |   | 
| + + + + + + + + | 
|   | 2   | 9  7 | 
| + + + + + + + + | 
| 6 4  | 3   |   | 
------------------------------------- 

(включая изменение 0s в пустые пространства)

Прямо сейчас я просто использую pprint.pprint для печати, но это становится сложной задачей. Как полное программирование noob, как я могу эффективно форматировать сетку?

EDIT: Мог ли я знать, почему я получаю downvoted? Несколько минут назад я сделал свой вопрос, чтобы задать этот вопрос, но я думаю, что предоставил достаточно информации, и я не могу найти этот вопрос в Stack Overflow.

+0

Конечно, извините, я просто с помощью стиля форматирования Я столкнулся в Интернете. – m4ge

+0

Я считаю, что вы были заблокированы, потому что у вас нет собственного кода. Просто заявить, что у вас есть код, недостаточно. Пожалуйста, покажите нам, что вы сделали. Кроме того, вы не определили «эффективно»: Pythonic, несколько строк кода, использование небольшой памяти, быстрая скорость или другое? Кроме того, ваши два примера не соответствуют друг другу. Кроме того, печать варьируется между Python 2.x и 3.x.Какую версию Python вы используете? –

+0

Извините, когда я имею в виду, что это неэффективно, я имею в виду, что это своего рода беспорядок, не очень прокомментированный, структура, которая, вероятно, заставит опытного программиста сжать, избыточные переменные и т. Д. Я использую python 3. Я добавлю некоторые из этих вещей для тела. – m4ge

ответ

2

Вот как я бы подготовить вывод, который вы хотите:

def print_sudoku(board): 
    print("-"*37) 
    for i, row in enumerate(board): 
     print(("|" + " {} {} {} |"*3).format(*[x if x != 0 else " " for x in row])) 
     if i == 8: 
      print("-"*37) 
     elif i % 3 == 2: 
      print("|" + "---+"*8 + "---|") 
     else: 
      print("|" + " +"*8 + " |") 

Есть три ключевых частей.

Первый заключается в использовании enumerate для повторения строк в доске и получения индекса каждой строки вместе с ним. Нам нужен индекс, чтобы указать, как строка после строки должна быть отформатирована.

Следующий бит ключа избавляется от нулей. Я использую подсчет списка [x if x != 0 else " " for x in row], который заменяет каждую строку 0 однострочной строкой. Теперь мне приходит в голову, что x or " " будет более кратким (но менее читаемым, возможно) способом делать x if x != 0 else " ".

Последний сложный бит - это форматирование строки. Вместо того, чтобы выписывать строку:

"| {} {} {} | {} {} {} | {} {} {} |" 

в полном объеме, я использовал конкатенацию и повторение, чтобы создать его более сжато:

("|" + " {} {} {} |"*3) 

Это используется в качестве строки формата для str.format, который подключается в одном значении из понимания списка вместо каждого {}.

Вы могли бы упростить вещи немного, если были готовы иметь плюс знаки на внешней границе:

+---+---+---+---+---+---+---+---+---+ 
| 4   |   5 |   | 
+ + + + + + + + + + 
|   |   | 1 9 8 | 
+ + + + + + + + + + 
| 3   |  8 2 | 4   | 
+---+---+---+---+---+---+---+---+---+ 
|   | 1   |  8  | 
+ + + + + + + + + + 
| 9  3 |   |   | 
+ + + + + + + + + + 
|   |  3  | 6 7  | 
+---+---+---+---+---+---+---+---+---+ 
|  5  |   9 |   | 
+ + + + + + + + + + 
|   | 2   | 9  7 | 
+ + + + + + + + + + 
| 6 4  | 3   |   | 
+---+---+---+---+---+---+---+---+---+ 

производится:

def print_sudoku2(board): 
    print("+" + "---+"*9) 
    for i, row in enumerate(board): 
     print(("|" + " {} {} {} |"*3).format(*[x if x != 0 else " " for x in row])) 
     if i % 3 == 2: 
      print("+" + "---+"*9) 
     else: 
      print("+" + " +"*9) 
+0

Спасибо за помощь! Не могли бы вы объяснить, как работает код? Я вижу, как работает последний оператор if, но я не понимаю 2 вещи: как для цикла итерации, и как «print ((« | »+« {} {} {} | "* 3) .format (* [ x, если x! = 0 else "" для x в строке])) "works – m4ge

+1

Я отредактировал с более подробным объяснением тонких битов кода. – Blckknght

+0

@ m4ge посмотреть примерно треть пути вниз по странице, «Основное использование метода str.format() выглядит следующим образом:« from https://docs.python.org/3/tutorial/inputoutput.html –

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

  • Нет связанных вопросов^_^