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

2023-11-23

这实际上是这个问题的一个变体,但不是重复的:

Python 反转/反转映射

给定一个像这样的字典:

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

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

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

请注意,每个键下的值都是唯一的。

Note:我以前有语法map = ... and dict = ...提醒不要使用map and dict因为它们是内置函数,请参阅下面的精彩评论和答案:)


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

Note: Using 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'}

We use 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(),它返回一个迭代器对象,该对象在迭代时给出一个键值对。

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


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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 反转/反转映射(但每个键有多个值) 的相关文章

随机推荐