Python反转/逆转映射(但每个键具有多个值)

11

这实际上是一个与此问题有所不同的变化:

Python反转/倒置映射

给定一个字典,例如:

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

如何反转这个字典以获得:

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

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

注意: 我之前使用了语法map = ...dict = ...。请勿使用mapdict,因为它们是内置函数,参见下面优秀的评论和答案 :)


1
map是一个关键字,不要将其用作字典名称。 - Malik Brahimi
我将结果更改为字典中的措辞。 - Kevin Lee
2
@KevinLee,dict也是一个关键字 :-)) - ForceBru
@ForceBru 谢谢,我没有深入思考 Python。 - Kevin Lee
2个回答

14

简而言之

使用字典推导式,就像这样

>>> 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方法,它返回一个视图对象。在官方文档中这里可以了解有关视图对象的更多信息。

iter*view*方法在Python 2.x中的区别

在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

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

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

print pm

输出:

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

注意:字典是一种无序数据结构,因此结果可能不会按您想要的顺序排序。


谢谢你提醒我无序的问题,最终我使用了库natsort来对我的字典进行排序。 - Kevin Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接