Invert keys and values of the original dictionary

匿名 (未验证) 提交于 2019-12-03 02:01:02

问题:

For example, I call this function by passing a dictionary as parameter:

>>> inv_map({'a':1, 'b':2, 'c':3, 'd':2}) {1: ['a'], 2: ['b', 'd'], 3: ['c']} >>> inv_map({'a':3, 'b':3, 'c':3}) {3: ['a', 'c', 'b']} >>> inv_map({'a':2, 'b':1, 'c':2, 'd':1}) {1: ['b', 'd'], 2: ['a', 'c']} 

If

map = { 'a': 1, 'b':2 } 

I can only invert this map to get:

inv_map = { 1: 'a', 2: 'b' } 

by using this

dict((v,k) for k, v in map.iteritems()) 

Anyone knows how to do that for my case?

回答1:

You can use a defaultdict with list:

>>> from collections import defaultdict >>> m = {'a': 2, 'b': 1, 'c': 2, 'd': 1} >>> dd = defaultdict(list) >>> for k, v in m.iteritems(): ...     dd[v].append(k) ...  >>> dict(dd) {1: ['b', 'd'], 2: ['a', 'c']} 

If you don't care if you have an dict or defaultdict, you can omit the last step und use the defaultdict directly.



回答2:

You can probably use defaultdict or setdefault here.

def invertDictionary(orig_dict):     result = {} # or change to defaultdict(list)     for k, v in orig_dict.iteritems():         result.setdefault(v, []).append(k) 


回答3:

EDIT In python 2.7:

from itertools import groupby def inv_map(d):     return {k : [i[0] for i in list(v)] for k, v in groupby(d.items(),lambda x:x[1])}  print inv_map({'a':1, 'b':2, 'c':3, 'd':2}) print inv_map({'a':3, 'b':3, 'c':3}) print inv_map({'a':2, 'b':1, 'c':2, 'd':1}) 

Output:

{1: ['a'], 2: ['b', 'd'], 3: ['c']} {3: ['a', 'c', 'b']} {1: ['b', 'd'], 2: ['a', 'c']} 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!