Python反向/反向映射(但每个键有多个值)

时间:2015-04-14 17:33:34

标签: python dictionary mapping inverse

这确实是这个问题的变体,但不是重复:

Python reverse / invert a mapping

给出一个像这样的字典:

mydict= { 'a': ['b', 'c'], 'd': ['e', 'f'] }

怎样才能反驳这个词:...

inv_mydict = { 'b':'a', 'c':'a', 'e':'d', 'f':'d' }

请注意,值在每个键下唯一地跨越。

注意:我之前有语法map = ...dict = ...提醒不要使用mapdict,因为它们是内置函数,请参阅下面的优秀评论和答案:)

2 个答案:

答案 0 :(得分:13)

TL; DR

使用字典理解,就像这样

>>> 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'}

上面看到的字典理解在功能上等同于填充空字典的以下循环结构

>>> 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'}

注意:使用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'}

我们在这里使用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'}

我们不喜欢2.x中的items()方法,因为它会返回一个键值对列表。我们不想构建一个列表来迭代和构造一个新的字典。这就是为什么我们更喜欢iteritems(),它返回一个迭代器对象,它在迭代时给出一个键值对。

注意: Python 3.x的items的实际等价物是Python 2.x的viewitems方法,它返回一个视图对象。请阅读官方文档here中有关视图对象的更多信息。


Python 2.x 中的

iter* vs view*方法

Python 2.x中iter*函数和view*函数之间的主要区别在于,视图对象反映了字典的当前状态。例如,

>>> d = {1: 2}
>>> iter_items = d.iteritems()
>>> view_items = d.viewitems()

现在我们在字典中添加一个新元素

>>> d[2] = 3

如果您尝试检查(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

但是视图对象将反映字典的当前状态。所以,它会正常工作

>>> (2, 3) in view_items
True

答案 1 :(得分:2)

mp = { 'a': ['b', 'c'], 'd': ['e', 'f'] }

pm={}
for x in mp.iterkeys():
    for d in mp[x]:
        pm[d]=x

print pm

输出:

  

{&#39; c&#39;&#39; a&#39;,&#39;&#39;:&#39; a&#39;,&#39; e&#39;:& #39; d&#39;,&#39; f&#39;:&#39; d&#39;}

注意:字典是非标准数据结构,因此结果可能不会按您的要求排序。