简体   繁体   中英

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.

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)

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM