All Projects → niklasf → indexed.py

niklasf / indexed.py

Licence: other
A Python dictionary that is indexed by insertion order

Programming Languages

python
139335 projects - #7 most used programming language

indexed.IndexedOrderedDict: a dictionary that is indexed by insertion order

Test PyPI package

Introduction

indexed.IndexedOrderedDict (alias indexed.Dict) is fully compatible with collections.OrderedDict 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.

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(). Including:

  • Initialization, setting, getting and deleting items
  • Iterating forwards and in reverse
  • d.clear()
  • d.popitem(last=True)
  • d.move_to_end(key, last=True)
  • d.keys(), d.values(), d.items()
  • d.pop(key[, default])
  • d.setdefault(key, default=None)
  • String representation
  • Pickling
  • Copying
  • Creating from keys
  • Comparing order sensitively with other ordered dictionaries or order insensitively with other mappings

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) [1] O(1) O(n) [1]
del d[key] O(1) O(n) O(n) O(n)
d.keys()[i] O(n) [2] O(n) [2] O(1) O(1)
d.values()[i] O(n) [3] O(n) [3] O(1) O(n)
d.items()[i] O(n) [3] O(n) [3] O(1) O(n)
d.keys().index(x) O(n) [3] O(n) [3] O(n) O(n)
[1](1, 2) These are amortized worst case runtimes.
[2](1, 2) 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)).
[3](1, 2, 3, 4, 5, 6) 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.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].