Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

MIDict (Multi-Index Dict) can be indexed by any "keys" or "values", suitable as a bidirectional/inverse dict or a multi-key/multi-value dict (a drop-in replacement for dict in Python 2 & 3).

Project Description

MIDict is an ordered “dictionary” with multiple indices where any index can serve as “keys” or “values”, capable of assessing multiple values via its powerful indexing syntax, and suitable as a bidirectional/inverse dict (a drop-in replacement for dict/OrderedDict in Python 2 & 3).


  • Multiple indices
  • Multi-value indexing syntax
  • Convenient indexing shortcuts
  • Bidirectional/inverse dict
  • Compatible with normal dict in Python 2 & 3
  • Accessing keys via attributes
  • Extended methods for multi-indices
  • Additional APIs to handle indices
  • Duplicate keys/values handling


name uid ip
jack 1 192.1
tony 2 192.2

The above table-like data set (with multiple columns/indices) can be represented using a MIDict:

user = MIDict([['jack', 1, '192.1'], # list of items (rows of data)
               ['tony', 2, '192.2']],
              ['name', 'uid', 'ip']) # a list of index names

Access a key and get a value or a list of values (similar to a normal dict):

user['jack'] == [1, '192.1']

Any index (column) can be used as the “keys” or “values” via the advanced “multi-indexing” syntax d[index_key:key, index_value]. Both index_key and index_value can be a normal index name or an int (the order the index), and index_value can also be a tuple, list or slice object to specify multiple values, e.g.:

user['name':'jack', 'uid'] == 1
user['ip':'192.1', 'name'] == 'jack'

user['name':'jack', ('uid', 'ip')] == [1, '192.1']
user[0:'jack', [1, 2]]             == [1, '192.1']
user['name':'jack', 'uid':]        == [1, '192.1']

The “multi-indexing” syntax also has convenient shortcuts:

user['jack'] == [1, '192.1']
user[:'192.1'] == ['jack', 1]
user['jack', :] == ['jack', 1, '192.1']

A MIDict with 2 indices can be used as a bidirectional/inverse dict:

mi_dict = MIDict(jack=1, tony=2)

mi_dict['jack'] == 1 # forward indexing: d[key] -> value
mi_dict[:1]     == 'jack' # backward/inverse indexing: d[:value] -> key




pip install midict

PyPI repository:


Source code:

Report issues:


python tests/

Tested with both Python 2.7 and Python 3,3, 3.4, 3.5.

Release History

This version
History Node


History Node


History Node


History Node


History Node


Download Files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, Size & Hash SHA256 Hash Help File Type Python Version Upload Date
(16.4 kB) Copy SHA256 Hash SHA256
Source None May 18, 2016

Supported By

Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Google Google Cloud Servers