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'}
上面看到的字典理解在功能上等价于下面填充空字典的循环结构
^{pr2}$
注意:使用map隐藏了内置的^{}函数。所以,除非你知道你在做什么,否则不要用它作为变量名。在
其他类似的方法
Python3.x版
您可以使用^{},如下所示>>> {value: key for key, values in my_map.items() for value in values}
{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}
我们在这里使用items()方法,它将从字典中创建一个视图对象,该对象将在迭代时给出键值对。所以我们只需迭代它,用逆映射构造一个新的字典。在
Python2.x版
您可以像这样使用^{}>>> {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(),它返回一个迭代器对象,该对象在迭代时给出一个键值对。在
注意:python3.x的items的实际等价物是python2.x的^{}方法,它返回一个view对象。阅读官方文档here中有关视图对象的更多信息。在
^python2.x中的{}与view*方法
python2.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 "", line 1, in
RuntimeError: dictionary changed size during iteration
但是view对象将反映字典的当前状态。所以,它会很好的>>> (2, 3) in view_items
True