2012-01-28 12 views
10

por lo general utilizar el siguiente idioma cuando se trabaja con un diccionario de Python:¿Cómo verificar una clave en un valor predeterminado sin actualizar el diccionario (Python)?

try: 
    val = dct[key] 
except KeyError: 
    print key, " is not valid" 

ya que para grandes diccionarios, la declaración

if key in dct: 
    # do something 

no es muy eficiente (por lo que recuerdo haber leído, pero he también lo noté en la práctica)

Hoy estaba trabajando con un default y por un momento olvidé que un defaultjudice nunca le dará un KeyError sino que actualizará el diccionario original.

¿Cómo puedo realizar una búsqueda sin actualizar el valor predeterminado? Realmente necesito imprimir un error para que el usuario pueda volver a ingresar la clave.

¡Gracias!

ACTUALIZACIÓN: Varios carteles sugirieron que mi creencia de que if key in dct: es lenta es falsa. Volví y revisé el libro en el que había leído que es mejor usar try: except:. Es el Python Cookbook 2002, Recipe 1.4 de Alex Martelli, que se puede encontrar también en línea aquí: Add an entry to dictionary. ¡Los viejos recuerdos son tan poco confiables! La receta no menciona "más lento" y ni siquiera está usando in, sino has_key. Simplemente dice que try: except: es más Pythonic (al menos la versión de libro de la receta). Gracias por la corrección y las respuestas.

+0

Posible duplicado http://stackoverflow.com/questions/1602934/what-is-a-good-way-to-test-if-a-key-exists-in-python-dictionary –

+1

No es una tontería; este es sobre 'defaultdict'. –

+7

'clave en d' no es lento, punto. Si dices lo contrario, será mejor que tengas una prueba sólida. 'timeit' dice que es tan rápido como una' d [key] 'exitosa, y mucho (casi 10x) más rápido que' d [key] '+' except: pass' (concedido, puede ser un poco más rápido que un ' if' si la clave está casi siempre presente). Ahora, 'clave en d.keys()' (Python 2.x) o 'clave en la lista (d.keys()) '(Python 3.x) es lento, pero eso porque está deliberadamente descartando la información de la tabla hash. – delnan

Respuesta

17

¿Cómo puedo realizar una búsqueda sin actualizar el valor predeterminado?

Con key in dct, es decir, explícitamente.

Si esto es realmente demasiado caro para usted (mida y usted estará seguro), hay soluciones para situaciones específicas. Por ejemplo, si su valor por defecto es 'ham' y en algunas situaciones que no quieren almacenar (key, 'ham') en el defaultdict cuando key no se encuentra, se puede hacer

dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything 
+7

'has_key' está en desuso en favor de' key in dct' - no promueva el uso de expresiones antiguas. – PaulMcG

8

key in dct tiene que ser rápido, diciendo que es lento sería como decir que dct[key] es lento, y que nunca debe ser el caso. Recuperar un elemento de un diccionario dada su clave y probar la pertenencia a una clave tiene que ser O (1) operaciones en cualquier implementación decente del diccionario, y es fácil ver cómo se podría implementar la operación de membresía en términos de la operación de acceso.

Para su pregunta con defaultdict, simplemente use in. Y no hay razón para evitar el uso de in en un diccionario normal.

Cuestiones relacionadas