2012-06-26 12 views

Respuesta

21
if k2 in d.get(k1, {}): 
    # do something 

El fragmento anterior es bueno si no se preocupan por si k1 realmente existe o no, y simplemente quiere saber si existe K2 en el interior del mismo, si es que existe. Como se puede ver en mi fragmento de código, prefiero el operador in, pero sólo pude decir con la misma facilidad

if d.get(k1, {}).has_key(k2): 
    # do something 

si lo prefiere ese idioma, pero el método has_key ya no se utiliza en Python 3.x, por lo que probablemente debería evitarlo.

+0

+1 para el operador 'in' – bpgergo

4
if d.has_key(k1) and d[k1].has_key(k2): 
+4

El método 'has_key()' ha quedado en desuso en python 3.x –

12

Puede utilizar in:

if k1 in d and k2 in d[k1]: 

El método has_key es obsoleto y se retira en Python 3.x

relacionadas:

+0

+1 para 'has_key()' o 'in'? – bpgergo

1

No utilice has_key() uso get() como has_key() ya no se utiliza en 3.x pitón:

d.get(k1,None) and d[k1].get(k2,None): 
2

La respuesta a la primera pregunta Es sí. Considero que la respuesta de Eli

if k2 in d.get(k1, {}): 

el mejor trazador de líneas, ya que evita buscar k1 en d dos veces. La respuesta a su segunda pregunta depende de lo que quiera hacer si cualquiera de las pruebas falla y si desea hacer algo diferente en los dos casos de falla. Si es así:

try: 
    d1 = d[k1] 
    if k2 in d1: 
     <both tests passed> 
    else: 
     <second test failed> 
except KeyError: 
    <first test failed> 
6

no tengo la reputación suficiente para comentar, pero tenga en cuenta que la primera sugerencia fallará si el valor de key1 es Ninguno.

if k2 in d.get(k1, {}): 
    # do something 

falla si d = {'k1': None} así que asegúrese del valor de las llaves.

Cuestiones relacionadas