2010-06-09 6 views
5

supongamos que tengo un diccionario cuyas claves son cadenas. ¿Cómo puedo crear eficientemente un nuevo diccionario a partir de lo que contiene solo las claves presentes en alguna lista?Selección de elementos de diccionario por clave de manera eficiente en Python

por ejemplo:

# a dictionary mapping strings to stuff 
mydict = {'quux': ..., 
      'bar': ..., 
      'foo': ...} 

# list of keys to be selected from mydict 
keys_to_select = ['foo', 'bar', ...] 

La forma en que se me ocurrió es:

filtered_mydict = [mydict[k] for k in mydict.keys() \ 
        if k in keys_to_select] 

pero creo que esto es muy ineficiente debido a que: (1) que requiere la enumeración de las teclas con teclas() , (2) requiere buscar k en keys_to_select cada vez. al menos uno de estos se puede evitar, creo. ¿algunas ideas? También puedo usar scipy/numpy si es necesario.

Respuesta

15
dict((k, mydict[k]) for k in keys_to_select) 

si sabe todas las teclas para seleccionar también son claves en mydict; Si ese no es el caso,

dict((k, mydict[k]) for k in keys_to_select if k in mydict) 
+1

Cuando se utiliza "si k en mydict" como este, no Python realizar un tipo de búsqueda has_key, o lo hace convertir las llaves en una lista/iterable y lazo sobre ellos? Si es el último, "if mydict.has_key (k)" podría ser más eficiente, ¿no? (No he encontrado ninguna documentación para aclarar, de cualquier manera, aún. Las habilidades de Google me fallaron). – pycruft

+1

Para responder a mi propia pregunta, usar "k en dict" es idéntico al uso de "dict.has_key (k)" de acuerdo con http://www.python.org/dev/peps/pep-0234/ – pycruft

+2

@pycruft, sip y, como 'timeit' cqn confirm (' python -mtimeit -s'd = dict.fromkeys (range (99)) ''23 en d''etc.),' in' es, de hecho, aproximadamente el doble de rápido como 'has_key' (guarda una búsqueda de atributo con nombre cada vez, que es aproximadamente la misma operación que un dict loolup). Nunca hay ninguna razón para usar 'has_key' más, y se ha eliminado de Python 3. –

Cuestiones relacionadas