Не совсем другое, просто немного переписанный рецепт из Кулинарной книги. Более того, он оптимизирован путем сохранения метода setdefault
вместо того, чтобы каждый раз проходить его через экземпляр:
def inverse(mapping):
'''
A function to inverse mapping, collecting keys with simillar values
in list. Careful to retain original type and to be fast.
>> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
>> inverse(d)
{1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
'''
res = {}
setdef = res.setdefault
for key, value in mapping.items():
setdef(value, []).append(key)
return res if mapping.__class__==dict else mapping.__class__(res)
Предназначен для работы под CPython 3.x, для 2.x заменить mapping.items()
на mapping.iteritems()
На моей машине работает немного быстрее, чем другие примеры здесь