像这样使用字典理解
>>> 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_itemsTraceback (most recent call last): File "<input>", line 1, in <module>RuntimeError: dictionary changed size during iteration
但是视图对象将反映字典的当前状态。所以就可以了
>>> (2, 3) in view_itemsTrue
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)