小编典典

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

python

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

Python反转/反转映射

给定这样的字典:

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

一个人怎么可以将这一命令转化为:

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

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

注意 :我以前没有使用语法map = ...dict = ...提醒,map并且dict它们是内置函数,请参见下面的出色注释和答案:)


阅读 215

收藏
2021-01-20

共1个答案

小编典典

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

我们不喜欢items()2.x中的方法,因为它会返回键-
值对的列表。我们不想构造一个列表只是为了迭代并构造一个新的字典。这就是为什么我们更喜欢使用iteritems(),它返回一个迭代器对象,该对象在迭代时提供键值对。

注意: Python 3.x的实际等效方法items是Python
2.x的viewitems方法,该方法返回一个视图对象。在此处阅读官方文档中有关视图对象的更多信息。


iter*vs view*Python 2.x中的方法

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

>>> 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
2021-01-20