Python: modifique un dict para convertir la clave en un valor y un valor en la clave

Digamos que tengo un diccionario dict, con los siguientes valores:

dict1 = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']} 

¿Cómo puedo hacer que uno de los valores sea la clave en un nuevo diccionario, dict1?

 dict2 = {'d': ['a','b', 'c', '1'], 'h': ['e','f', 'g', '2']} 

 In [12]: d = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']} In [13]: dict((v[-1],v[:-1]+[k]) for k,v in d.iteritems()) Out[13]: {'d': ['a', 'b', 'c', '1'], 'h': ['e', 'f', 'g', '2']} 

k es la clave original, v es el valor original (la lista). En el resultado, v[-1] convierte en la nueva clave y v[:-1]+[k] convierte en el nuevo valor.

editar Como señaló Adrien Plisson, Python 3 no admite iteritems . Además, en Python 2.7+ y 3, se puede usar un diccionario de comprensión:

 {v[-1]: v[:-1]+[k] for k,v in d.items()} # Python 2.7+ 

Y aún otro enfoque:

 dict1 = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']} dict2 = {} for k in dict1: dict2[dict1[k][-1]]= dict1[k] dict2[dict1[k][-1]][-1] = k print dict2 #{'h': ['e', 'f', 'g', '2'], 'd': ['a', 'b', 'c', '1']} 

convierte la clave en un valor, y un valor en la clave:

 dict2 = dict( (dict1[key], key) for key in dict1 ) 

o

 dict2 = dict( (value,key) for key, value in dict1.items() ) 

Ambos funcionan para todas las versiones de Python.


caso especial

Solo en el caso especial del ejemplo en la pregunta esto no funciona, porque una lista no puede usarse como una clave. Entonces, usando el último elemento de cada lista como clave y reemplazando este último elemento con la clave anterior, obtenemos lo más complicado:

 dict2 = dict( (dict1[key][-1], dict1[key][:-1]+[key]) for key in dict1 ) 

Tenga en cuenta que desde Python 3.0, dict.iterkeys(), dict.itervalues(), and dict.iteritems() ya no son válidos. dict.keys(), dict.values(), and dict.items() están bien. Solo con iterar sobre un dict (como en for key over dict1 ) se for key over dict1 la lista de claves. A menudo se utilizan claves ordenadas como en

 keys = sorted(mydict)