Hash table using linear probing
break (or better yet return)

Instead of doing done = False/True. You could just use break and get rid of done altogether. But even better than that, just return.

This:

        if self.keys[ind] == key:
            val = self.vals[ind]
            done = True


Becomes:

        if self.keys[ind] == key:
            return self.vals[ind] # Value found!


This:

            if ind == start_ind:
                done = True

            elif self.keys[ind] == None:
                done = True


Becomes:

            if ind == start_ind: # Not found!
                return

            elif self.keys[ind] == None: # Not found!
                return


(You can return None if you want).

This gets rid of the val variable (and done)