2011-02-04 15 views
10

Tengo una pregunta acerca de los diccionarios en Python.Encontrar todos los elementos clave con el mismo valor en Dicts

aquí está:

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

Ahora quiero conseguir todos los elementos clave por el mismo valor y guardarlo en un nuevo dict.

El nuevo Dict debe verse como:

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

+6

No utilice "dict" como nombre de variable, ya que es el nombre de una función incorporada. –

Respuesta

20

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

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 se quiere evitar el uso de defaultdict, también podría hacer

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

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

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']} 
0

Si desea específicamente tuplas como los valores en el nuevo diccionario, todavía se puede utilizar defaultdict, y utilizar la concatenación tupla. 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(<class 'tuple'>, {'a': ('abc', 'gh'), 'g': ('fh', 'hfz'), 'b': ('cdf',)}) 

esta probablemente será más lenta que la generación de un diccionario mediante la inserción de lista y va a crear más objetos para ser recogidos. Por lo tanto, usted puede construir su diccionario de listas, y luego asignar 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 le dará el mismo resultado que el anterior.

Cuestiones relacionadas