2010-12-16 16 views
6

Realmente dos preguntas: si tengo un diccionario (que originalmente vino de analizar un mensaje json) que tiene una matriz opcional en ella:Python: Combine "if 'x' in dict" y "for i in dict ['x']"

dict_with = {'name':'bob','city':'san francisco','kids': {'name': 'alice'} } 
dict_without = {'name':'bob','city':'san francisco' } 

me normalmente tienen un código como:

if 'kids' in dict: 
    for k in dict['kids']: 
     #do stuff 

Mi primera pregunta ¿hay alguna forma de pitón para combinar la protección y si el bucle?

La segunda cuestión es que mi instinto me dice que el mejor diseño para el mensaje JSON original sería especificar siempre el elemento de niños, sólo con un diccionario vacío:

dict_better = {'name':'bob','city':'san francisco','kids': {} } 

No puedo encontrar ninguna metodología de diseño eso corrobora esto. El mensaje json es un mensaje de estado de un servicio web que admite representaciones json y xml. Como comenzaron con xml, lo hicieron para que el elemento "niños" fuera opcional, lo que obliga a la construcción anterior a verificar si el elemento existe antes de iterar sobre la matriz. Me gustaría saber si es mejor diseñarlo para decir que el elemento es obligatorio (solo con una matriz vacía si no hay elementos).

Respuesta

10
for x in d.get("kids",()): 
    print "kid:", x 
7

Una secuencia vacía no genera iteración.

for k in D.get('kids',()): 
+1

Para cualquiera que no lo sepa, 'dict.get (clave, predeterminado)' devuelve el valor asociado con 'key' si existe o' default' si no lo tiene. – DGH

+1

... y '()' es la tupla vacía. Instintivamente, me habría ido con '[]', pero de todos modos no hay diferencia práctica. – delnan

+0

@delnan es muy posible que su instinto sea usar [] porque tantas funciones de biblioteca estándar devuelven listas independientemente del tipo de secuencia de entrada (por ejemplo, 'ordenado'). Mi instinto es preferir() porque documenta mi falta de deseo de hacer cualquiera de las cosas con el resultado de que requieren una lista. ;) –

4

[x for x in dict_with.get('kids')], Se puede utilizar esta filter, map - a functional programming tools con la lista de comprensión.

  • comprensión de la lista son más concisos de escribir.
  • funcionan mucho más rápido que el manual para las instrucciones de bucle.
  • Para evitar key-error use dict_with.get('xyz',[]) devuelve una lista vacía.