反转原始字典的键和值

8
例如,我通过传递一个字典作为参数来调用此函数:
>>> 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']}

如果

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

我只能反转这张地图得到:
inv_map = { 1: 'a', 2: 'b' }

通过使用这个
dict((v,k) for k, v in map.iteritems())

有人知道如何在我的情况下做到这一点吗?
3个回答

14
你可以使用一个带有列表的 defaultdict:

您可以使用带有列表的 defaultdict:

>>> 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']}
如果您不介意使用字典或默认字典,可以省略最后一步并直接使用默认字典。

1
请注意,最后一行将 collections.defaultdict 转换回普通的 dict 往往是不必要甚至是不可取的。 - Mike Graham
@MikeGraham,你能解释一下为什么吗?如果不加那行代码,我经常会犯更多的错误(因为如果查找一个不存在的键,它会将其添加)。 - tomasyany

8
你可以在这里使用defaultdict或者setdefault
def invertDictionary(orig_dict):
    result = {} # or change to defaultdict(list)
    for k, v in orig_dict.iteritems():
        result.setdefault(v, []).append(k)

2

编辑在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})

输出:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接