Tengo un dict
que tiene un montón de entradas. Solo estoy interesado en unos pocos de ellos. ¿Hay una manera fácil de eliminar a todos los demás?
python
dictionary
mpen
fuente
fuente
Respuestas:
Construyendo un nuevo dict:
Utiliza la comprensión del diccionario.
Si utiliza una versión que carece de ellas (es decir, Python 2.6 y versiones anteriores), hágalo
dict((your_key, old_dict[your_key]) for ...)
. Es lo mismo, aunque más feo.Tenga en cuenta que esto, a diferencia de la versión de jnnnnn, tiene un rendimiento estable (depende solo del número de your_keys) para
old_dict
s de cualquier tamaño. Ambos en términos de velocidad y memoria. Como se trata de una expresión generadora, procesa un elemento a la vez y no examina todos los elementos de old_dict.Eliminar todo en su lugar:
fuente
old_dict
indica un error en otro lugar, y en ese caso prefiero un error a resultados silenciosamente incorrectos.Ligeramente más elegante comprensión dict:
fuente
mydict.iteritems()
lugar..items()
crea otra listaAquí hay un ejemplo en Python 2.6:
La parte de filtrado es la
if
declaración.Este método es más lento que la respuesta de delnan si solo desea seleccionar algunas de las muchas teclas.
fuente
if key in ('x','y','z')
, supongo.Puede hacerlo con la función de proyecto de mi biblioteca funcy :
También eche un vistazo a select_keys .
fuente
Código 1:
Código 2:
Código 3:
Todas las partes del rendimiento del código se miden con timeit usando number = 1000, y se recopilan 1000 veces para cada fragmento de código.
Para Python 3.6, el rendimiento de tres formas de filtrar claves de dictado es casi el mismo. Para python 2.7, el código 3 es un poco más rápido.
fuente
Este liner lambda debería funcionar:
Aquí hay un ejemplo:
Es una comprensión básica de la lista que itera sobre sus claves de dictado (i en x) y genera una lista de pares de tuplas (clave, valor) si la clave vive en la lista de claves deseada (y). Un dict () envuelve todo para que salga como un objeto dict.
fuente
set
forwanted_keys
, pero por lo demás se ve bien.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
vuelve{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
como estaba previsto.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
y el resultado fue{}
, que supuse que era un dict en blanco.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
obtengo:{'0': [1, 3], '2': [1, 4]}
cuál es el resultado esperadoDado su diccionario original
orig
y el conjunto de entradas que le interesankeys
:que no es tan bueno como la respuesta de delnan, pero debería funcionar en todas las versiones de Python de interés. Sin embargo, es frágil para cada elemento
keys
existente en su diccionario original.fuente
Basado en la respuesta aceptada por delnan.
¿Qué pasa si una de sus claves deseadas no está en el old_dict? La solución delnan arrojará una excepción KeyError que puede atrapar. Si eso no es lo que necesitas, tal vez quieras:
solo incluya claves que se eliminen tanto en old_dict como en su conjunto de wanted_keys.
tiene un valor predeterminado para las claves que no está establecido en old_dict.
fuente
{k: old_dict.get(k, default) for k in ...}
Esta función hará el truco:
Al igual que la versión de delnan, esta utiliza la comprensión del diccionario y tiene un rendimiento estable para diccionarios grandes (depende solo de la cantidad de claves que permita y no de la cantidad total de claves en el diccionario).
Y al igual que la versión de MyGGan, esta permite que su lista de claves incluya claves que pueden no existir en el diccionario.
Y como beneficio adicional, aquí está el inverso, donde puede crear un diccionario excluyendo ciertas claves en el original:
Tenga en cuenta que, a diferencia de la versión de delnan, la operación no se realiza en su lugar, por lo que el rendimiento está relacionado con la cantidad de teclas en el diccionario. Sin embargo, la ventaja de esto es que la función no modificará el diccionario proporcionado.
Editar: se agregó una función separada para excluir ciertas teclas de un dict.
fuente
keys
por cualquier tipo de iterable, como lo que acepta el conjunto .invert
implica quekeys
se mantiene el argumento o quekeys
se rechaza el argumento?", ¿Cuántos de ellos estarían de acuerdo?Si queremos hacer un nuevo diccionario con las claves seleccionadas eliminadas, podemos hacer uso de la comprensión del diccionario.
Por ejemplo:
fuente
Otra opción:
Pero obtienes un
list
(Python 2) o un iterador (Python 3) devuelto porfilter()
, no adict
.fuente
filtered
endict
y obtiene nuevamente el diccionario!Forma corta:
Como la mayoría de las respuestas sugieren para mantener la concisión, tenemos que crear un objeto duplicado ya sea un
list
odict
. Este crea un descartelist
pero elimina las claves en originaldict
.fuente
Aquí hay otro método simple que se utiliza
del
en un revestimiento:e_keys
es la lista de las claves que se excluirán. Actualizará su dict en lugar de darle uno nuevo.Si desea un nuevo dict de salida, haga una copia del dict antes de eliminar:
fuente
Podrías usar
python-benedict
, es una subclase dict.Instalación:
pip install python-benedict
Es de código abierto en GitHub: https://github.com/fabiocaccamo/python-benedict
Descargo de responsabilidad: soy el autor de esta biblioteca.
fuente