Python reverse / inverse a mapping (but with multiple values for each key)
这确实是对这个问题的一个变体,但不是一个副本:
python反转/反转映射
像这样的字典:
如何将此dict转换为:
江户十一〔一〕号
请注意,每个键下的值范围都是唯一的。
注:我以前有语法
DR
像这样使用字典理解
1 2 3 | >>> 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'} |
上面看到的字典理解在功能上相当于下面的循环结构,它填充空字典
1 2 3 4 5 6 7 | >>> 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'} |
号
注意:使用
其他类似的方法
Python3.x
你可以这样使用
1 2 | >>> {value: key for key, values in my_map.items() for value in values} {'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'} |
我们在这里使用
Python2.x
你可以这样使用
1 2 | >>> {value: key for key, values in my_map.iteritems() for value in values} {'c': 'a', 'b': 'a', 'e': 'd', 'f': 'd'} |
。
我们不喜欢在2.x中使用
注意:python 3.x的
在python 2.x中,
1 2 3 | >>> d = {1: 2} >>> iter_items = d.iteritems() >>> view_items = d.viewitems() |
现在我们在字典中添加一个新元素
1 | >>> d[2] = 3 |
。
如果您试图检查EDOCX1(键值对)是否在
1 2 3 4 | >>> (2, 3) in iter_items Traceback (most recent call last): File"<input>", line 1, in <module> RuntimeError: dictionary changed size during iteration |
。
但是视图对象将反映字典的当前状态。所以,它会很好地工作的
1 2 | >>> (2, 3) in view_items True |
1 2 3 4 5 6 7 8 | mp = { 'a': ['b', 'c'], 'd': ['e', 'f'] } pm={} for x in mp.iterkeys(): for d in mp[x]: pm[d]=x print pm |
。
输出:
{'c': 'a', 'b': 'a', 'e': 'd', 'f': 'd'}
号
注意:字典是一个无序的数据结构,因此结果可能不会按您希望的那样排序。