Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a 'multimap' implementation in Python?

I am new to Python, and I am familiar with implementations of Multimaps in other languages. Does Python have such a data structure built-in, or available in a commonly-used library?

To illustrate what I mean by "multimap":

a = multidict() a[1] = 'a' a[1] = 'b' a[2] = 'c'  print(a[1])  # prints: ['a', 'b'] print(a[2])  # prints: ['c'] 
like image 898
James Bond Avatar asked Nov 13 '09 21:11

James Bond


People also ask

What is Python Multimap?

MultiMap 1.0. 3Mapping class which allows multiple values per key and preserves order by value; values with the same key are not grouped together.

How do you define Multimap?

In computer science, a multimap (sometimes also multihash, multidict or multidictionary) is a generalization of a map or associative array abstract data type in which more than one value may be associated with and returned for a given key.

What is the use of Multimap?

Multimap is similar to a map with the addition that multiple elements can have the same keys. Also, it is NOT required that the key-value and mapped value pair have to be unique in this case. One important thing to note about multimap is that multimap keeps all the keys in sorted order always.


2 Answers

Such a thing is not present in the standard library. You can use a defaultdict though:

>>> from collections import defaultdict >>> md = defaultdict(list) >>> md[1].append('a') >>> md[1].append('b') >>> md[2].append('c') >>> md[1] ['a', 'b'] >>> md[2] ['c'] 

(Instead of list you may want to use set, in which case you'd call .add instead of .append.)


As an aside: look at these two lines you wrote:

a[1] = 'a' a[1] = 'b' 

This seems to indicate that you want the expression a[1] to be equal to two distinct values. This is not possible with dictionaries because their keys are unique and each of them is associated with a single value. What you can do, however, is extract all values inside the list associated with a given key, one by one. You can use iter followed by successive calls to next for that. Or you can just use two loops:

>>> for k, v in md.items(): ...     for w in v: ...         print("md[%d] = '%s'" % (k, w)) ...  md[1] = 'a' md[1] = 'b' md[2] = 'c' 
like image 96
Stephan202 Avatar answered Sep 18 '22 18:09

Stephan202


Just for future visitors. Currently there is a python implementation of Multimap. It's available via pypi

like image 23
Michal Avatar answered Sep 20 '22 18:09

Michal