{"record":{"id":"93f403e38d8146d7","repo":"TheAlgorithms/Python","slug":"key","errorCode":null,"errorMessage":"{key}","messagePattern":"\\{key\\}","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"data_structures/hashing/hash_map.py","lineNumber":257,"sourceCode":"        ...     hm[i] = i\n        >>> len(hm._buckets)\n        100\n        >>> hm[75] = 75\n        >>> len(hm._buckets)\n        200\n\n        ## Resize down\n        >>> del hm[75]\n        >>> len(hm._buckets)\n        200\n        >>> del hm[74]\n        >>> len(hm._buckets)\n        100\n        \"\"\"\n        for ind in self._iterate_buckets(key):\n            item = self._buckets[ind]\n            if item is None:\n                raise KeyError(key)\n            if item is _deleted:\n                continue\n            if item.key == key:\n                self._buckets[ind] = _deleted\n                self._len -= 1\n                break\n        if self._is_sparse():\n            self._size_down()\n\n    def __getitem__(self, key: KEY) -> VAL:\n        \"\"\"\n        Returns the item at the given key\n\n        >>> hm = HashMap(5)\n        >>> hm._add_item(1, 10)\n        >>> hm.__getitem__(1)\n        10\n","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/data_structures/hashing/hash_map.py#L239-L275","documentation":"Raised by HashMap.__delitem__ (hash_map.py) with the key as the exception payload: `raise KeyError(key)`. During open-addressing probe iteration, hitting an empty bucket means the key was never inserted, so deletion raises KeyError. (Tombstoned _deleted slots are skipped, not treated as missing.) This is the standard dict-compatible contract — `del hm[k]` behaves like `del d[k]`.","triggerScenarios":"del hm[k] for a key never added; deleting a key already deleted; deleting after clear(); using a key of a different type than stored (e.g. 1 vs '1', or 1 vs True collisions aside, hash-equal but different keys).","commonSituations":"Idempotent cleanup code that assumes del is safe; deleting entries filtered from another collection; key-type drift between insert and delete phases.","solutions":["Guard with membership: `if k in hm: del hm[k]` (HashMap implements __contains__)","Wrap in try/except KeyError for bulk cleanup loops","Canonicalize keys (same type/normalization) at both insert and delete sites"],"exampleFix":"# before\ndel hm[42]  # KeyError if absent\n\n# after\nif 42 in hm:\n    del hm[42]","handlingStrategy":"validation","validationCode":"if key in hm:\n    del hm[key]","typeGuard":null,"tryCatchPattern":"try:\n    del hm[key]\nexcept KeyError:\n    pass  # idempotent delete","preventionTips":["Use `key in hm` before every del — matches dict semantics exactly","Keep key types consistent between insert and delete phases","In bulk cleanup, catch KeyError once around the loop rather than per key"],"tags":["hash-map","key-error","delete","open-addressing"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}