2011-11-28 6 views
7

que tengo una lista de diccionarios como en este ejemplo:manera elegante para transformar una lista de dict en un diccionario de dicts

listofdict = [{'name': 'Foo', 'two': 'Baz', 'one': 'Bar'}, {'name': 'FooFoo', 'two': 'BazBaz', 'one': 'BarBar'}] 

sé que 'nombre' existe en cada diccionario (al igual que la otra teclas) y que es único y no aparece en ninguno de los otros diccionarios en la lista.

Me gustaría una buena forma de acceder a los valores de 'dos' y 'uno' utilizando la clave 'nombre'. ¿Supongo que un diccionario de diccionarios sería más conveniente? Al igual que:

{'Foo': {'two': 'Baz', 'one': 'Bar'}, 'FooFoo': {'two': 'BazBaz', 'one': 'BarBar'}} 

que tiene esta estructura que pueda repetir fácilmente sobre los nombres, así como obtener los otros datos utilizando el nombre como clave. ¿Tiene alguna otra sugerencia para una estructura de datos?

Mi pregunta principal es: ¿Cuál es la forma más agradable y más Pythonic de hacer esta transformación?

Respuesta

14
d = {} 
for i in listofdict: 
    d[i.pop('name')] = i 

si tiene Python2.7 +:

{i.pop('name'): i for i in listofdict} 
+3

¡Una vez que '.pop()', no puede detenerse! – kindall

5
dict((d['name'], d) for d in listofdict) 

es la más fácil si no te importa la clave name que queda en el dict.

Si desea eliminar los name s, todavía puede hacerlo fácilmente en una línea:

dict(zip([d.pop('name') for d in listofdict], listofdict)) 
+0

puede utilizar 'd.pop ('nombre')', como lo hice (pero no en una comprensión) – JBernardo

Cuestiones relacionadas