2010-10-17 13 views
41

tengo un diccionario:Consigue un subconjunto de un diccionario de Python

{'key1':1, 'key2':2, 'key3':3} 

que necesito para pasar un subconjunto de ese diccionario de código de terceros. Solo quiere un diccionario que contenga las claves ['key1', 'key2', 'key99'] y si recibe otra clave (p. Ej., 'key3'), explota en un desastre desagradable. El código en cuestión está fuera de mi control, así que me quedé en una posición donde tengo que limpiar mi diccionario.

¿Cuál es la mejor manera de limitar un diccionario a un conjunto de claves?

Dado el diccionario ejemplo y permitió teclas arriba, quiero:

{'key1':1, 'key2':2} 

Respuesta

47
In [38]: adict={'key1':1, 'key2':2, 'key3':3} 
In [41]: dict((k,adict[k]) for k in ('key1','key2','key99') if k in adict) 
Out[41]: {'key1': 1, 'key2': 2} 

En python3 (o Python2.7 o posterior) que puede hacerlo con un dict-comprehension también:

>>> {k:adict[k] for k in ('key1','key2','key99') if k in adict} 
{'key2': 2, 'key1': 1} 
+7

Dict comprehensions también están en Python 2.7. –

+0

Ojalá hubiera un operador para esto. Al igual que 'adict - {'key1'} == {'key2': 2, 'key3': 3}' – wim

+0

Parece que no hay una inversión razonable del método 'dict.update' – wim

19
dict(filter(lambda i:i[0] in validkeys, d.iteritems())) 
+0

Me encantó la implementación simple y dulce. –

+2

Para python 3, debería ser 'd.items()'. – refi64

Cuestiones relacionadas