# Learn Classes and Objects by Building a Sudoku Solver - Step 73

### Tell us what’s happening:

You should assign a list comprehension that iterates over row to the row_str variable.

``````class Board:
def __init__(self, board):
self.board = board

# User Editable Region

def __str__(self):
board_str = ''
for row in self.board:
row_str = str([[] for i in row])

# User Editable Region

def find_empty_cell(self):
for row, contents in enumerate(self.board):
try:
col = contents.index(0)
return row, col
except ValueError:
pass
return None

def valid_in_row(self, row, num):
return num not in self.board[row]

def valid_in_col(self, col, num):
return all(self.board[row][col] != num for row in range(9))

def valid_in_square(self, row, col, num):
row_start = (row // 3) * 3
col_start = (col // 3) * 3
for row_no in range(row_start, row_start + 3):
for col_no in range(col_start, col_start + 3):
if self.board[row_no][col_no] == num:
return False
return True

def is_valid(self, empty, num):
row, col = empty
valid_in_row = self.valid_in_row(row, num)
valid_in_col = self.valid_in_col(col, num)
valid_in_square = self.valid_in_square(row, col, num)
return all([valid_in_row, valid_in_col, valid_in_square])

def solver(self):
if (next_empty := self.find_empty_cell()) is None:
return True
for guess in range(1, 10):
if self.is_valid(next_empty, guess):
row, col = next_empty
self.board[row][col] = guess
if self.solver():
return True
self.board[row][col] = 0
return False

def solve_sudoku(board):
gameboard = Board(board)
print(f'Puzzle to solve:\n{gameboard}')
if gameboard.solver():
print(f'Solved puzzle:\n{gameboard}')
else:
print('The provided puzzle is unsolvable.')
return gameboard

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

User Agent is: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0`

### Challenge Information:

Learn Classes and Objects by Building a Sudoku Solver - Step 73

declare a variable `row_str` and assign it a list comprehension that iterates over `row` and turns each item `i` in `row` into a string.

Considering an example list comprehension:

``````[expression for i in iterable]
``````

You want the expression to be something that turns `i` into a string. How do you do that using `str()`?

Right now you are trying to turn a list into a string.

1 Like

row_str = [ for str(i) in row]
It is still showing error.

You are using an empty list as expression and you broke it the iteration part.

The part on the right side of the `for` keyword is fine

``````[<expression> for i in row]
``````

You need to write an expression that turns `i` into a string and put it in place of `<expression>`.

row_str = [[str(i)] for str(i) in row]

You are getting closer but there’s a logic problem here:

This means create a list in which every element from `row` is converted into a string and put it into a list.
You end up with a list of lists, with each internal list containing a string:
`[[<string>], [<string>], [<string>], ...]`
while you want:
`[<string>, <string>, <string>, ...]`

Actually, I missed a bit. You should keep the `for i in row` part as it is.
`i` is the variable that you need to iterate over `row`. You cannot perform operations on it.

Thanks a lot. I got it.

1 Like