Encuentra todos los elementos clave por el mismo valor en Dicts

Tengo una pregunta sobre los diccionarios en Python.

aquí está:

Tengo un dict como dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' }

Ahora quiero obtener todos los elementos clave por el mismo valor y guardarlos en un nuevo dictado.

El nuevo Dict debería verse como:

new_dict = { 'b':('cdf'), 'a':('abc','gh'), 'g':('fh','hfz')}

Si está bien con listas en lugar de tuplas en el nuevo diccionario, puede usar

 from collections import defaultdict some_dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' } new_dict = defaultdict(list) for k, v in some_dict.iteritems(): new_dict[v].append(k) 

Si desea evitar el uso de defaultdict , también puede hacer

 new_dict = {} for k, v in some_dict.iteritems(): new_dict.setdefault(v, []).append(k) 

Aquí hay una implementación ingenua. Alguien con mejores habilidades de Python probablemente pueda hacerlo más conciso y sorprendente.

 dict = { 'abc':'a', 'cdf':'b', 'gh':'a', 'fh':'g', 'hfz':'g' } new_dict = {} for pair in dict.items(): if pair[1] not in new_dict.keys(): new_dict[pair[1]] = [] new_dict[pair[1]].append(pair[0]) print new_dict 

Esto produce

 {'a': ['abc', 'gh'], 'b': ['cdf'], 'g': ['fh', 'hfz']} 

Si desea específicamente las tuplas como valores en su nuevo diccionario, aún puede usar el valor predeterminado y la concatenación de tuplas. Esta solución funciona en Python 3.4+:

 from collections import defaultdict source = {'abc': 'a', 'cdf': 'b', 'gh': 'a', 'fh': 'g', 'hfz': 'g'} target = defaultdict(tuple) for key in source: target[source[key]] += (key, ) print(target) 

Que producirá

 defaultdict(, {'a': ('abc', 'gh'), 'g': ('fh', 'hfz'), 'b': ('cdf',)}) 

Esto probablemente será más lento que generar un diccionario por inserción de lista, y creará más objetos para recostackr. Por lo tanto, puedes construir tu diccionario a partir de listas y luego mapearlo en tuplas:

 target2 = defaultdict(list) for key in source: target2[source[key]].append(key) for key in target2: target2[key] = tuple(target2[key]) print(target2) 

Lo que dará el mismo resultado que el anterior.