Indexed.py
A Python dictionary that is indexed by insertion order
Install / Use
/learn @niklasf/Indexed.pyREADME
indexed.IndexedOrderedDict: a dictionary that is indexed by insertion order
.. image:: https://github.com/niklasf/indexed.py/actions/workflows/test.yml/badge.svg :target: https://github.com/niklasf/indexed.py/actions/workflows/test.yml :alt: Test
.. image:: https://badge.fury.io/py/indexed.svg :target: https://pypi.python.org/pypi/indexed :alt: PyPI package
Introduction
indexed.IndexedOrderedDict (alias indexed.Dict) is feature compatible
with collections.OrderedDict as of Python 3.11 and can be used as
a drop in replacement.
The main difference is that key, value and item views support accessing
elements by their index.
.. code-block:: python
d = indexed.IndexedOrderedDict()
d["first-key"] = "first-value"
d["second-key"] = "second-value"
d["third-key"] = "third-value"
values = d.values()
assert values[2] == "third-value"
assert d.keys().index("second-key") == 1
Features
-
Access keys, values and items by index, e.g.,
d.keys()[5]. -
Find the index of a key, e.g.,
d.keys().index("key"). -
Sort keys in place, e.g.,
d.sort().
Excluding those additions the API is the same as the API of
collections.OrderedDict().
Installing
::
pip install indexed
Performance
Performance is practically on the same order of magnitude as the built in
collections.OrderedDict, with exceptions in bold:
================= ========== ================== ======== ======================
d collections.OrderedDict indexed.IndexedOrderedDict
Operation Avergage Worst case Average Worst case ================= ========== ================== ======== ====================== d.copy() O(n) O(n) O(n) O(n)
d[key] O(1) O(n) O(1) O(n)
d[key] = value O(1) O(n) [#a]_ O(1) O(n) [#a]_
del d[key] O(1) O(n) O(n) O(n)
d.keys()[i] O(n) [#k]_ O(n) [#k]_ O(1) O(1)
d.values()[i] O(n) [#v]_ O(n) [#v]_ O(1) O(n)
d.items()[i] O(n) [#v]_ O(n) [#v]_ O(1) O(n)
d.keys().index(x) O(n) [#v]_ O(n) [#v]_ O(n) O(n) ================= ========== ================== ======== ======================
.. [#a] These are amortized_ worst case runtimes.
.. [#k] This does not work in Python 3 because colections.KeysView is not
indexable. One of the theoretically best work arounds is
next(itertools.islice(d.keys(), i, i + 1)).
.. [#v] Assuming the theoretically best possible workaround.
License
This library is derived from CPython's collections.OrderedDict
and licensed under the PSFL.
See the LICENSE file for the full license text.
.. _amortized: http://en.wikipedia.org/wiki/Amortized_analysis
Related Skills
node-connect
350.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
110.4kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
110.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
350.8kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
