user3067803
user3067803

Reputation: 13

Python Check a 2d list for empty strings?

I've been trying to figure out this problem for multiple hours and still no luck. I'm in the process of writing Connect4 in Python for a school assignment and I need a function that checks if the board is full.

Here is my init function

    def __init__( self, width, height ): 
    self.width = width 
    self.height = height 
    self.data = [] # this will be the board 

    for row in range( self.height ): 
        boardRow = [] 
        for col in range( self.width ): 
            boardRow += [' '] 
        self.data += [boardRow] 

My repr function

    def __repr__(self): 
    #print out rows & cols 
    s = '' # the string to return 
    for row in range( self.height ): 
        s += '|' # add the spacer character 
        for col in range( self.width ): 
            s += self.data[row][col] + '|' 
        s += '\n' 

s += '--'*self.width + '-\n'

for col in range( self.width ):
    s += ' ' + str(col % 10)
s += '\n'

return s

And what I have for my isFull function

    def isFull(self):
# check if board is full
for row in range(0,(self.height-(self.height-1))):
    for col in range(0,self.width):
    if (' ') not in self.data[row][col]:
        return True

I want to check and see if there this ' ' (a space) within the data list. At least I think that's my problem, I'm not experienced in python so I may be misreading my issue. If anyone has any ideas I'm glad to listen.

Upvotes: 1

Views: 979

Answers (2)

KobeJohn
KobeJohn

Reputation: 7545

So if there is any space, it means the board is not full?

Various versions:

# straightforward but deep
def is_full(self):
    for row in self.data:
        for cell in row:
            if cell == ' ':
                return False
    return True

# combine the last two
def is_full(self):  # python functions/methods are usually lower case
    for row in self.data:  # no need to index everything like c
        if any(cell == ' ' for cell in row):  # any/all are convenient testers
            return False  # if you find even one, it's done.
    return True  # if you couldn't disqualify it, then it looks full

# one line, not especially readable
def is_full(self):
    return not any(cell == ' ' for row in d for cell in row)

Upvotes: 2

justhalf
justhalf

Reputation: 9117

Your logic for isFull method is incorrect.

In your current code, you are returning True from isFull as soon as you found a non-empty cell. That is incorrect. You should do the opposite.

You should be doing what kobejohn had posted earlier: to return False as soon as you found an empty cell.

And in Python you should work without indices if possible, and use Python natural looping, like in the code kobejohn had posted.

Upvotes: 1

Related Questions