Voici une réponse très générale conçue pour gérer plusieurs occurrences de valeurs multiples dans de grands dictionnaires. Manipuler des cas plus spécifiques et/ou avec de petits dictionnaires - comme votre exemple - pourrait être fait beaucoup plus rapidement.
from collections import defaultdict
my_dicts = [
{ 'key1' : 'value1',
'key2' : 'value2' },
{ 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'value2' }, # dup added for testing
{ 'key1' : 'value1',
'key2' : 'value2' }]
def reverse(dct):
""" Create dictionary mapping each value to list of one or more keys """
ret = defaultdict(list)
for key,val in dct.iteritems():
ret[val].append(key)
return ret
def replace_values(dicts, replacments):
""" Replace values in each dict in dicts """
for dct in dicts:
revdict = reverse(dct)
for oldval,newval in replacments.iteritems():
for key in revdict.get(oldval, []):
dct[key] = newval
replace_values(my_dicts, {'value2':'value3'})
print my_dicts
# [{'key2': 'value3', 'key1': 'value1'},
# {'key3': 'value3', 'key2': 'value3', 'key1': 'value1'},
# {'key2': 'value3', 'key1': 'value1'}]
Recherchez-vous 'value2' dans différents 'keyX'? Combien de mises à jour allez-vous effectuer, juste une par traversée? – kevpie
Quelles hypothèses peuvent être faites - comme sera-t-il toujours associé à la même clé, ou peut-il se produire sous d'autres ou plusieurs clés? Voulez-vous jamais mettre à jour plus d'une valeur à la fois? – martineau