Bri*_*unt 597 python mapping reverse dictionary
给出这样的字典:
my_map = {'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
如何反转此地图以获得:
inv_map = {1: 'a', 2: 'b'}
Run Code Online (Sandbox Code Playgroud)
编者注: __CODE__改为__CODE__避免与内置函数冲突,__CODE__.下面有些评论可能会受到影响.
Sil*_*ost 825
对于Python 2.7.x
inv_map = {v: k for k, v in my_map.iteritems()}
Run Code Online (Sandbox Code Playgroud)
对于Python 3+:
inv_map = {v: k for k, v in my_map.items()}
Run Code Online (Sandbox Code Playgroud)
小智 168
假设dict中的值是唯一的:
dict((v, k) for k, v in my_map.iteritems())
Run Code Online (Sandbox Code Playgroud)
Rob*_*ney 121
如果值my_map不是唯一的:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, [])
inv_map[v].append(k)
Run Code Online (Sandbox Code Playgroud)
fs.*_*fs. 41
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
Run Code Online (Sandbox Code Playgroud)
syk*_*ora 32
试试这个:
inv_map = dict(zip(my_map.values(), my_map.keys()))
Run Code Online (Sandbox Code Playgroud)
(请注意,字典视图上的Python文档明确保证.keys()并且.values()它们的元素具有相同的顺序,这允许上述方法起作用.)
或者:
inv_map = dict((my_map[k], k) for k in my_map)
Run Code Online (Sandbox Code Playgroud)
或使用python 3.0的字典理解
inv_map = {my_map[k] : k for k in my_map}
Run Code Online (Sandbox Code Playgroud)
Bre*_*ire 22
另一种更实用的方式:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
Run Code Online (Sandbox Code Playgroud)
小智 11
字典值是集合的情况。喜欢:
some_dict = {"1":{"a","b","c"},
"2":{"d","e","f"},
"3":{"g","h","i"}}
Run Code Online (Sandbox Code Playgroud)
逆函数会喜欢:
some_dict = {vi: k for k, v in some_dict.items() for vi in v}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
{'c': '1',
'b': '1',
'a': '1',
'f': '2',
'd': '2',
'e': '2',
'g': '3',
'h': '3',
'i': '3'}
Run Code Online (Sandbox Code Playgroud)
Ani*_*non 11
很多答案,但没有找到任何干净的东西,以防我们谈论具有非唯一值的字典。
解决方案是:
from collections import defaultdict
inv_map = defaultdict(list)
for k, v in my_map.items():
inv_map[v].append(k)
Run Code Online (Sandbox Code Playgroud)
如果初始字典my_map = {'c': 1, 'd': 5, 'a': 5, 'b': 10}
然后,运行上面的代码将给出:
{5: ['a', 'd'], 1: ['c'], 10: ['b']}
Run Code Online (Sandbox Code Playgroud)
这扩展了Python反向/反转映射的答案,适用于dict中的值不唯一的时候.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, []).append(k)
return revdict
Run Code Online (Sandbox Code Playgroud)
实施是有限的,你不能使用reversed两次并获得原来的.它不是对称的.它使用Python 2.6进行测试.这是我用于打印结果字典的用例.
如果您更愿意使用a而set不是a list,并且有些应用程序对此有意义,而不是setdefault(v, []).append(k)使用setdefault(v, set()).add(k).
我们还可以使用来重复键重复的字典defaultdict:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in c.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
Run Code Online (Sandbox Code Playgroud)
看这里:
与使用的等效技术相比,此技术更简单,更快
dict.setdefault()。
例如,您有以下字典:
dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
Run Code Online (Sandbox Code Playgroud)
你想以这样的倒置形式得到它:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
Run Code Online (Sandbox Code Playgroud)
第一个解决方案。要反转字典中的键值对,请使用for-loop 方法:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dict()
for key, value in dict.items():
inverted_dict.setdefault(value, list()).append(key)
Run Code Online (Sandbox Code Playgroud)
第二个解决方案。使用字典理解方法进行反演:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in dict.items()}
Run Code Online (Sandbox Code Playgroud)
第三个解决方案。使用反转反转方法(依赖于第二种解决方案):
# Use this code to invert dictionaries that have lists of values
dict = {value: key for key in inverted_dict for value in my_map[key]}
Run Code Online (Sandbox Code Playgroud)
小智 5
列表与字典理解的结合.可以处理重复的键
{v:[i for i in d.keys() if d[i] == v ] for k,v in d.items()}
Run Code Online (Sandbox Code Playgroud)