2012-07-18 13 views
5

Tengo un dict grande de pitón creado a partir de datos json y estoy creando un dict más pequeño del grande. Algunos elementos del diccionario grande tienen una clave llamada 'detalles' y algunos elementos no. Lo que quiero hacer es verificar si la clave existe en cada entrada en el diccionario grande y si no, anexar la clave 'detalles' con el valor 'No hay detalles disponibles' para el nuevo diccionario. Estoy poniendo un código de muestra debajo solo como una demostración. El LargeDict es mucho más grande con muchas teclas en mi código, pero lo mantengo simple para mayor claridad.Compruebe si la clave existe en el diccionario. Si no, añádalo

LargeDict = {'results': 
[{'name':'john','age':'23','datestart':'12/07/08','department':'Finance','details':'Good Employee'}, 
{'name':'barry','age':'26','datestart':'25/08/10','department':'HR','details':'Also does payroll'}, 
{'name':'sarah','age':'32','datestart':'13/05/05','department':'Sales','details':'Due for promotion'}, 
{'name':'lisa','age':'21','datestart':'02/05/12','department':'Finance'}]} 

Esta es la forma en que estoy recibiendo los datos para el SmallDict:

SmallDict = {d['name']:{'department':d['department'],'details':d['details']} for d in LargeDict['results']} 

recibo un error clave, sin embargo, cuando uno de los grandes entradas de diccionario no tiene detalles. ¿Estoy en lo cierto al decir que necesito usar el módulo DefaultDict o hay una manera más fácil?

Respuesta

2

Utilice el método get(key, defaultVar) para suministrar un valor predeterminado cuando la llave 'details' es que falta:

SmallDict = {d['name']:{'department':d['department'],'details':d.get('details','No details available')} for d in LargeDict['results']} 
13

No necesita un collections.defaultdict. Puede usar el método setdefault de objetos de diccionario.

d = {} 
bar = d.setdefault('foo','bar') #returns 'bar' 
print bar # bar 
print d #{'foo': 'bar'} 

Como otros han señalado, si no desea agregar la clave para el diccionario, puede utilizar el método get.

aquí hay un viejo reference que a menudo me encuentro mirando.

+0

+1 (a partir de los documentos) dict.setdefault(): "Si la clave está en el diccionario, devolver su valor si no, introduzca la llave con un valor de defecto y de retorno. predeterminado. Por defecto, el valor predeterminado es Ninguno. " – heltonbiker

+0

Sí. Utilizar esta. defaultdict es una criatura malvada para los incautos. – javadba

+1

FWIW, creo que 'defaultdict' es genial. Principalmente, no creo que valga la pena convertir un 'dict' normal a un' defaultdict' si lo obtuviste de otra fuente. Los "males" de 'defaultdict' se pueden eludir simplemente estableciendo el atributo' default_factory' en 'None' (lo que hará que se comporte como un dict regular una vez más). – mgilson

4

Puede usar collections.defaultdict si desea crear una entrada en su dict automáticamente. Sin embargo, si no lo hace, y sólo quiere "No disponible" (o lo que sea), a continuación, puedes asignar a la dict como d[key] = v y utilizar d.get(k, 'Not available') por un valor predeterminado

Cuestiones relacionadas