2010-08-09 28 views

Respuesta

13
d2.get('ham', {}).get('fry', 88) 

Probablemente lo desglosaría en varias declaraciones en la vida real.

ham = d2.get('ham', {}) 
fry = ham.get('fry', 88) 
+3

en lugar 'd2.get ('jamón', {}) get ('freír', 99)', no? (¡SECO!) – mykhal

+1

¡Haciendo algo legible! = Repitiéndote. Repetirse sería escribir una función para obtener alevines de jamón, y luego otra función para obtener alevines de spam, cuando ambas funciones podrían escribirse como una función que toma ham/spam como parámetro. –

+0

@Jesse, la versión anterior tenía dos referencias a 'fry' y dos referencias al número mágico que se devuelve. La sugerencia fue una clara mejora. – Oddthinking

3

Para los valores por defecto de llegar al trabajo correctamente la primera por defecto es necesario que haya un diccionario, por lo que puede encadenar la .get llama correctamente si el primero falla.

d.get('ham',{}).get('fry',88) 

también se podría utilizar un intento, a excepción del bloque

def get_ham_fry() 
    try: 
    return d['ham']['fry'] 
    except AttributeError,e: 
    return 88 
+0

La indexación de cadenas aumentará una 'KeyError' si no se encuentra ninguna clave, o' TypeError' si el elemento no admite indexación de cadenas. Creo que 'AttributeError' solo es apropiado para las llamadas' get' –

3

Si necesita hacer esto mucho, se puede escribir una función auxiliar

def get_nested(d, list_of_keys, default): 
    for k in list_of_keys: 
     if k not in d: 
      return default 
     d=d[k] 
    return d 

print get_nested(d2,['ham','spam'],99) 
print get_nested(d2,['ham','grill'],99) 
+0

Se siente como reducir. 'Functools.reduce (lambda d, x: d [x] si x en d es el valor predeterminado, ['ham', 'spam'], d2) ' – kennytm

+1

@KennyTM, lo que provoca un' TypeError' para '['bacon', 'spam']' –

0

Aquí hay una solución para hacer frente with nested dictionaries:

def get(root, *keys): 
    """ 
    Returns root[k_1][k_2]...[k_n] if all k_1, ..., k_n are valid keys/indices. 
    Returns None otherwise 
    """ 
    if not keys: 
     return root 
    if keys[0] not in root: 
     return None 
    if keys[0] in root: 
     return get(root[keys[0]], *keys[1:]) 

Uso:.

>>> d = {'a': 1, 'b': {'c': 3}} 
>>> get(d, 'b', 'c') 
3 
>>> get(d. 'key that's not in d') 
None 
>>> get(d) 
{'a': 1, 'b': {'c': 3}} 
Cuestiones relacionadas