2012-03-09 22 views
5

mi ritrovo spesso utilizza questo costrutto:Aggiornare un dict con parte di un altro dict

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

Tipo di aggiornare dict1 con un sottoinsieme di dict2.

penso che non c'è un metodo costruito per fare la stessa cosa in forma

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

Quale approccio di solito prende? Ti sei fatto una tua funzione per quello? Come sembra?

Commenti?


Ho presentato un idea per python-idee:

A volte si desidera un dict che è sottoinsieme di un altro dict. Sarebbe bello se dict.items accettasse un elenco opzionale di chiavi da restituire. Se nessuna chiave è data - usa il comportamento predefinito - ottieni tutti gli articoli.

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'} 

Quindi, per aggiornare un dict con una parte di un altro dizionario, si usa:

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

risposta

5

non esiste alcuna funzione built-in che conosco, ma questo sarebbe un semplice 2-liner :

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

Non ho imparato nulla di nuovo - non c'è davvero alcuna scorciatoia ... Mi piace questa risposta - è più esplicita. E penso che sia più veloce della risposta aquavitae, in quanto non crea alcun elenco o generatore intermedio. – warvariuc

7

si potrebbe fare così:

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

Penso che dovrebbe essere dict1.update ({k: dict2 [k] per k in keys}) (si aggiorna con un dict, non con un elenco) –

+0

@GuyAdini In 2.7, anche il tuo funziona. Ma nelle versioni precedenti, questo non esisteva ancora. l'aquavitae è assolutamente corretto. – glglgl

+0

Il mio male, hai ragione. –

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

è uguale a 'dict1.update (dict2)' – warvariuc

+0

Spiegare cosa fa e utilizzare quattro spazi di indentazione in modo che il codice sia formattato correttamente. – agf

Problemi correlati