gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:43:39 25 4
gpt4 key购买 nike

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

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 因为它们是内置函数,请参阅下面的优秀评论和答案:)

最佳答案

长话短说

像这样使用字典理解

>>> 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() 方法,它会从字典中创建一个 View 对象,它会在迭代时给出键值对。所以我们只是迭代它并用逆映射构造一个新字典。

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方法,它返回一个 View 对象。在官方文档中阅读有关 View 对象的更多信息,here .


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

Python 2.x 中iter* 函数和view* 函数之间的主要区别在于, View 对象反射(reflect)字典的当前状态。例如,

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

但是 View 对象将反射(reflect)字典的当前状态。所以,它会很好地工作

>>> (2, 3) in view_items
True

关于Python 反转/反转映射(但每个键有多个值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29633848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com