Last active
October 4, 2025 17:57
-
-
Save xflr6/9dd28969ff62f8d9370c1f7af35a2566 to your computer and use it in GitHub Desktop.
Iterate over dictionaries with variable keys in predefined order
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """Iterate over dicts with variable keys in predefined order.""" | |
| from collections.abc import Iterable | |
| from typing import Self | |
| class KeyOrder(dict): | |
| """Key -> index mapping for iterating over dicts (unknown keys last).""" | |
| @classmethod | |
| def fromlist(cls, keys: Iterable[str]) -> Self: | |
| """Define the order of keys as given.""" | |
| return cls((k, i) for i, k in enumerate(keys)) | |
| def itersorted(self, dct): | |
| """Iterate over dct (key, value) pairs in the defined order.""" | |
| for key in sorted(dct, key=self._itersorted_key): | |
| yield key, dct[key] | |
| def _itersorted_key(self, key): | |
| return self[key], key | |
| _missing = float('inf') | |
| def __missing__(self, key) -> float: | |
| return self._missing | |
| if __name__ == '__main__': | |
| keyorder = KeyOrder.fromlist(['spam', 'eggs']) | |
| spam = {'spam': 'spam', 'ham': 'ham', 'eggs': 'eggs'} | |
| for k, v in keyorder.itersorted(spam): | |
| print(k) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment