dictionary - Python reverse / inverse a mapping (but with multiple values for each key) -
this variation on question, not duplicate:
python reverse / invert mapping
given dictionary so:
mydict= { 'a': ['b', 'c'], 'd': ['e', 'f'] }
how can 1 invert dict get:
inv_mydict = { 'b':'a', 'c':'a', 'e':'d', 'f':'d' }
note values span uniquely under each key.
note: had syntax map = ... , dict = ... reminder not use map , dict built-in functions, see excellent comments , answers below :)
tl;dr
use dictionary comprehension, this
>>> my_map = { 'a': ['b', 'c'], 'd': ['e', 'f'] } >>> {value: key key in my_map value in my_map[key]} {'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'} the above seen dictionary comprehension functionally equivalent following looping structure populates empty dictionary
>>> inv_map = {} >>> key in my_map: ... value in my_map[key]: ... inv_map[value] = key ... >>> inv_map {'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'} note: using map shadows built-in map function. so, don't use variable name unless know doing.
other similar ways same
python 3.x
you can use dict.items, this
>>> {value: key key, values in my_map.items() value in values} {'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'} we use items() method here, create view object dictionary give key value pairs on iteration. iterate on , construct new dictionary inverse mapping.
python 2.x
you can use dict.iteritems this
>>> {value: key key, values in my_map.iteritems() value in values} {'c': 'a', 'b': 'a', 'e': 'd', 'f': 'd'} we don't prefer items() method in 2.x, because return list of key-value pairs. don't want construct list iterate , construct new dictionary. why prefer iteritems(), returns iterator object gives key value pair on iteration.
note: actual equivalent of python 3.x's items python 2.x's viewitems method, returns view object. read more view object in official documentation, here.
iter* vs view* methods in python 2.x
the main difference between iter* functions , view* functions in python 2.x that, view objects reflect current state of dictionary. example,
>>> d = {1: 2} >>> iter_items = d.iteritems() >>> view_items = d.viewitems() now add new element dictionary
>>> d[2] = 3 if try check if (2, 3) (key-value pair) in iter_items, throw error
>>> (2, 3) in iter_items traceback (most recent call last): file "<input>", line 1, in <module> runtimeerror: dictionary changed size during iteration but view object reflect current state of dictionary. so, work fine
>>> (2, 3) in view_items true
Comments
Post a Comment