LRU Cache in constant time
Usual comment: add """docstrings""" to public methods at the very least. 

Avoid double (and triple) lookups.  Python has fast exception handling.  Instead of testing for existence, and then fetching the value, just fetch the value.  And don’t fetch it more than once.  Ie, replace this:

if key in self.dict:
    val = self.dict[key].val
    self.list.delete(self.dict[key])
    self._insert(key, val)
    return val 
else:
    return -1


with this:

try:
    node = self.dict[key]
    val = node.val
    self.list.delete(node)
    self._insert(key, val)
    return val 
except KeyError:
    return -1


Above, you are deleting/discarding a ListNode containing a key-value pair, and then immediately creating a new ListNode with the same key-value pair to insert.  LinkedList.insert() takes the trouble to clean the node for insertion; why not reuse the node?  You wouldn’t have to update self.dict[key], either. 

Similar optimizations for put():  don’t do double lookups and possibly reuse node (but with updated .val).