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
python
dictionary
igorgue
fuente
fuente

keys()es solo una vista de conjunto en un diccionario en lugar de una copia, también lox in d.keys()es O (1). Aún así,x in des más pitónico.x in d.keys()debe construir y destruir un objeto temporal, completo con la asignación de memoria que conlleva, dondex in d.keys()solo está haciendo una operación aritmética (calculando el hash) y haciendo una búsqueda. Tenga en cuenta qued.keys()solo es aproximadamente 10 veces más largo que esto, que todavía no es realmente largo. No lo he verificado, pero todavía estoy bastante seguro de que es solo O (1).ingana sin dudas, no solo en elegancia (y no en desuso ;-) sino también en rendimiento, por ejemplo:Si bien la siguiente observación no siempre es cierta, notará que , por lo general , en Python, la solución más rápida es más elegante y pitónica; por eso
-mtimeites TAN útil: ¡no se trata solo de ahorrar cien nanosegundos aquí y allá!)fuente
has_keyparece ser O (1) también.Según los documentos de Python :
fuente
has_key()ahora se elimina en Python 3Use
dict.has_key()si (y solo si) se requiere que su código sea ejecutable por versiones de Python anteriores a la 2.3 (cuandokey in dictse introdujo).fuente
Hay un ejemplo donde
inrealmente mata tu rendimiento.Si lo usa
inen un contenedor O (1) que solo implementa__getitem__yhas_key()no__contains__lo hará, convertirá una búsqueda O (1) en una búsqueda O (N) (ya queinretrocede a una búsqueda lineal a través de__getitem__).La solución es obviamente trivial:
fuente
has_key()es específico de los diccionarios Python 2 .in/__contains__es la API correcta para usar; para aquellos contenedores en los que es inevitable una exploración completa, no hay ningúnhas_key()método de todos modos , y si hay un enfoque O (1), entonces ese será el caso de uso específico y el desarrollador debe elegir el tipo de datos correcto para el problema.has_keyes un método de diccionario, peroinfuncionará en cualquier colección, e incluso cuando__contains__falte,inusará cualquier otro método para iterar la colección para averiguarlo.fuente
inpruebas enrangeobjetos. Sin embargo, no estoy tan seguro de su eficacia en Python 2xrange. ;)__contains__puede calcular trivialmente si un valor está en el rango o no.rangeinstancia cada vez. Usando una sola instancia preexistente, la prueba de "entero en el rango" es aproximadamente un 40% más rápida en mis tiempos.La solución a dict.has_key () está en desuso, use 'in' - sublime text editor 3
Aquí he tomado un ejemplo de diccionario llamado 'edades':
fuente
Ampliando las pruebas de rendimiento de Alex Martelli con los comentarios de Adam Parkin ...
fuente
Si tienes algo como esto:
cámbielo a continuación para ejecutarlo en Python 3.X y superior:
fuente
t.has_key(ew)devuelveTruesi el valor deewreferencia también es una clave en el diccionario.key not in tdevuelveTruesi el valor no está en el diccionario. Además, elkey = ewalias es muy, muy redundante. La ortografía correcta esif ew in t. Que es lo que la respuesta aceptada de 8 años antes ya le dijo.