Kev*_*Lee 8 python mapping dictionary inverse
这实际上是这个问题的变体,但不是重复的:
给出这样的字典:
mydict= { 'a': ['b', 'c'], 'd': ['e', 'f'] }
怎么能反转这个字典得到:
inv_mydict = { 'b':'a', 'c':'a', 'e':'d', 'f':'d' }
请注意,值在每个键下唯一地跨越.
注意:我以前有语法map = ...和dict = ...提醒不使用map,dict因为它们是内置函数,请参阅下面的优秀评论和答案:)
the*_*eye 13
使用字典理解,像这样
>>> my_map = { 'a': ['b', 'c'], 'd': ['e', 'f'] }
>>> {value: key for key in my_map for value in my_map[key]}
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
Run Code Online (Sandbox Code Playgroud)
上面看到的字典理解在功能上等同于填充空字典的以下循环结构
>>> inv_map = {}
>>> for key in my_map:
... for value in my_map[key]:
... inv_map[value] = key
...
>>> inv_map
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
Run Code Online (Sandbox Code Playgroud)
注意:使用map阴影内置map函数.因此,除非您知道自己在做什么,否则不要将其用作变量名.
其他类似的方法也是如此
Python 3.x
你可以dict.items像这样使用
>>> {value: key for key, values in my_map.items() for value in values}
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
Run Code Online (Sandbox Code Playgroud)
我们items()在这里使用方法,它将从字典中创建一个视图对象,它将在迭代时给出键值对.所以我们只是迭代它并使用逆映射构造一个新的字典.
Python 2.x
你可以dict.iteritems像这样使用
>>> {value: key for key, values in my_map.iteritems() for value in values}
{'c': 'a', 'b': 'a', 'e': 'd', 'f': 'd'}
Run Code Online (Sandbox Code Playgroud)
我们不喜欢items()2.x中的方法,因为它将返回一个键值对列表.我们不想构建一个列表来迭代和构造一个新的字典.这就是我们更喜欢的原因iteritems(),它返回一个迭代器对象,它在迭代时给出一个键值对.
注意: Python 3.x的实际等价物items是Python 2.x的viewitems方法,它返回一个视图对象.在此处阅读官方文档中有关视图对象的更多信息.
iter*vs view*2.x中的方法Python 2.x中iter*函数和view*函数之间的主要区别在于,视图对象反映了字典的当前状态.例如,
>>> d = {1: 2}
>>> iter_items = d.iteritems()
>>> view_items = d.viewitems()
Run Code Online (Sandbox Code Playgroud)
现在我们在字典中添加一个新元素
>>> d[2] = 3
Run Code Online (Sandbox Code Playgroud)
如果您尝试检查(2, 3)(键值对)是否在iter_items,它将引发错误
>>> (2, 3) in iter_items
Traceback (most recent call last):
File "<input>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Run Code Online (Sandbox Code Playgroud)
但是视图对象将反映字典的当前状态.所以,它会工作正常
>>> (2, 3) in view_items
True
Run Code Online (Sandbox Code Playgroud)