2012-03-09 14 views
5

często znajduję się przy użyciu tego konstruktu:Aktualizacja dict ze strony innego dict

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

Kind aktualizacji dict1 z podzbioru dict2.

myślę, że nie ma wbudowanego sposób robi to samo w formie

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

Jakie podejście zwykle trwa? Czy zrobiłeś dla tego swoją funkcję? Jak to wygląda?

Komentarze?


I złożyli idea do Pythona pomysłów:

Czasami chcesz dict, który jest podzbiorem innego dict. Byłoby miło, gdyby dict.items zaakceptował opcjonalną listę kluczy do zwrotu. Jeśli nie podano żadnego klucza, użyj domyślnego zachowania - pobierz wszystkie elementy.

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

Tak aby zaktualizować dict z częścią innego dict, użyłbyś:

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

Odpowiedz

5

Nie ma wbudowaną funkcję wiem, ale byłoby to prosty 2-liner :

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

Nie nauczyłem się niczego nowego - tak naprawdę nie ma żadnego skrótu ... Podoba mi się ta odpowiedź - jest bardziej jednoznaczna. I myślę, że jest szybszy niż odpowiedź aquavitae, ponieważ nie tworzy żadnych pośrednich list ani generatorów. – warvariuc

7

można to zrobić tak:

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

Myślę, że powinien to być dict1.update ({k: dict2 [k] dla k in keys}) (aktualizujesz dyktem, a nie listą) –

+0

@GuyAdini W wersji 2.7 Twój również działa. Ale w starszych wersjach to jeszcze nie istniało. aquavitae jest absolutnie poprawne. – glglgl

+0

Moja zła, masz rację. –

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

to jest to samo co 'dict1.update (dict2)' – warvariuc

+0

Proszę wyjaśnij, co to robi, i użyj czterech spacji wcięcia, aby twój kod został poprawnie sformatowany. – agf