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.