Инвертировать ключи и значения исходного словаря

Например, я вызываю эту функцию, передавая словарь в качестве параметра:

>>> 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 }

Я могу только инвертировать эту карту, чтобы получить:

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

с помощью этого

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

Кто-нибудь знает, как это сделать для моего случая?


person kn3l    schedule 05.09.2011    source источник


Ответы (3)


Вы можете использовать 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']}

Если вам все равно, есть ли у вас словарь или defaultdict, вы можете пропустить последний шаг и использовать defaultdict напрямую.

person Martin Thurau    schedule 05.09.2011
comment
Обратите внимание, что последняя строка — преобразование collections.defaultdict обратно в обычный dict — очень часто не требуется или даже нежелательна. - person Mike Graham; 05.09.2011
comment
@MikeGraham Не могли бы вы объяснить, почему, пожалуйста? Я часто делаю больше ошибок, когда не добавляю эту строку (потому что, если вы ищете несуществующий ключ, он его добавит). - person tomasyany; 21.04.2017

Вероятно, вы можете использовать здесь defaultdict или setdefault.

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

EDIT В 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']}
person Quinn    schedule 15.03.2016