2012-03-09 13 views
5

a menudo me encuentro utilizando este constructo:actualizar un diccionario con parte de otro dict

dict1['key1'] = dict2['key1'] 
dict1['key2'] = dict2['key2'] 
dict1['key3'] = dict2['key3'] 

tipo de actualización de dict1 con un subconjunto de dict2.

creo que no hay un método integrado para hacer lo mismo en forma

dict1.update_partial(dict2, ('key1', 'key2', 'key3')) 

¿Qué enfoque que toma habitualmente? ¿Has hecho tu propia función para eso? ¿Como se ve?

Comentarios?


he presentado una idea a Python-ideas:

A veces quieren un diccionario que es subconjunto de otro dict. Sería bueno si dict.items aceptara una lista opcional de claves para devolver. Si no hay claves dadas - use el comportamiento predeterminado - obtenga todos los artículos.

class NewDict(dict): 

    def items(self, keys=()): 
     """Another version of dict.items() which accepts specific keys to use.""" 
     for key in keys or self.keys(): 
      yield key, self[key] 


a = NewDict({ 
    1: 'one', 
    2: 'two', 
    3: 'three', 
    4: 'four', 
    5: 'five' 
}) 

print(dict(a.items())) 
print(dict(a.items((1, 3, 5)))) 

[email protected]:~/Desktop$ python test.py 
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} 
{1: 'one', 3: 'three', 5: 'five'} 

Así que para actualizar un diccionario con una parte de otro dict, se debería utilizar:

dict1.update(dict2.items(['key1', 'key2', 'key3'])) 

Respuesta

5

no hay una función incorporada que conozco, pero esto sería un simple 2-liner :

for key in ('key1', 'key2', 'key3'): 
    dict1 = dict2[key] 
+0

No aprendí nada nuevo, realmente no hay ningún atajo ... Me gusta esta respuesta, es más explícito. Y creo que es más rápido que la respuesta de Aquavitae, ya que no crea ninguna lista intermedia o generador. – warvariuc

7

que podría hacerlo de esta manera:

keys = ['key1', 'key2', 'key3'] 
dict1.update((k, dict2[k]) for k in keys) 
+0

Creo que debería ser dict1.update ({k: dict2 [k] para k en claves}) (actualiza con un dict, no con una lista) –

+0

@GuyAdini En 2.7, el tuyo también funciona. Pero en versiones anteriores, esto no existía todavía. Aquavitae es absolutamente correcto. – glglgl

+0

Malo, tienes razón. –

0
dict1.update([(key, dict2[key]) for key in dict2.keys()]) 
+0

esto es lo mismo que 'dict1.update (dict2)' – warvariuc

+0

Explique qué hace esto, y use cuatro espacios de sangría para que su código esté formateado correctamente. – agf

Cuestiones relacionadas