¿Debo usar ‘has_key ()’ o ‘in’ en los dicts de Python?

Me pregunto qué es mejor hacer:

d = {'a': 1, 'b': 2} 'a' in d True 

o:

 d = {'a': 1, 'b': 2} d.has_key('a') True 

Definitivamente es más python.

De hecho, has_key() se eliminó en Python 3.x.

gana sin problemas, no solo en elegancia (y no está en desuso 😉 sino también en rendimiento, por ejemplo:

 $ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d' 10000000 loops, best of 3: 0.0983 usec per loop $ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)' 1000000 loops, best of 3: 0.21 usec per loop 

Si bien la siguiente observación no siempre es cierta, notará que generalmente , en Python, la solución más rápida es más elegante y Pythonic; es por eso que -mtimeit es TAN útil – ¡no se trata solo de ahorrar cien nanosegundos aquí y allá! -)

Según los documentos de python:

has_key() está en desuso en favor de la key in d .

Use dict.has_key() si (y solo si) se requiere que su código sea ejecutable por versiones de Python anteriores a la 2.3 (cuando se introdujo la key in dict ).

Hay un ejemplo donde in realidad mata su rendimiento.

Si usa un contenedor O (1) que solo implementa __getitem__ y has_key() pero no __contains__ , convertirá una búsqueda O (1) en una búsqueda O (N) (como in regresa a una búsqueda lineal a través de __getitem__ ) .

La solución es obviamente trivial:

 def __contains__(self, x): return self.has_key(x) 

has_key es un método de diccionario, pero funcionará en cualquier colección, e incluso cuando __contains__ falta, utilizará cualquier otro método para iterar la colección para averiguarlo.

La solución para dict.has_key () está en desuso, use ‘in’ – editor de texto sublime 3

Aquí he tomado un ejemplo de diccionario llamado ‘edades’ –

 ages = {} # Add a couple of names to the dictionary ages['Sue'] = 23 ages['Peter'] = 19 ages['Andrew'] = 78 ages['Karren'] = 45 # use of 'in' in if condition instead of function_name.has_key(key-name). if 'Sue' in ages: print "Sue is in the dictionary. She is", ages['Sue'], "years old" else: print "Sue is not in the dictionary" 

Ampliando las pruebas de rendimiento de Alex Martelli con los comentarios de Adam Parkin …

 $ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)' Traceback (most recent call last): File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main x = t.timeit(number) File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit timing = self.inner(it, self.timer) File "", line 6, in inner d.has_key(12) AttributeError: 'dict' object has no attribute 'has_key' $ python2.7 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)' 10000000 loops, best of 3: 0.0872 usec per loop $ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)' 10000000 loops, best of 3: 0.0858 usec per loop $ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d' 10000000 loops, best of 3: 0.031 usec per loop $ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d' 10000000 loops, best of 3: 0.033 usec per loop $ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d.keys()' 10000000 loops, best of 3: 0.115 usec per loop $ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()' 10000000 loops, best of 3: 0.117 usec per loop 

Python 2.x es compatible con has_key() .

Python 2.3+ y Python 3.x son compatibles in .

Si tienes algo como esto

 t.has_key(ew) 

cámbielo a continuación para ejecutarlo en Python 3.X y superior

 key = ew if key not in t