Skip to content

Instantly share code, notes, and snippets.

@xflr6
Last active October 4, 2025 17:57
Show Gist options
  • Select an option

  • Save xflr6/9dd28969ff62f8d9370c1f7af35a2566 to your computer and use it in GitHub Desktop.

Select an option

Save xflr6/9dd28969ff62f8d9370c1f7af35a2566 to your computer and use it in GitHub Desktop.
Iterate over dictionaries with variable keys in predefined order
"""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