2010-11-27 9 views
10
my_dicts = [ 
    { 'key1' : 'value1', 
     'key2' : 'value2' }, 

    { 'key1' : 'value1', 
     'key2' : 'value2' }, 

    { 'key1' : 'value1', 
     'key2' : 'value2' }] 

Quel serait le moyen le plus efficace de remplacer toutes les instances de 'value2' par 'value3'?Modifier les valeurs dans une liste de dictionnaires?

+0

Recherchez-vous 'value2' dans différents 'keyX'? Combien de mises à jour allez-vous effectuer, juste une par traversée? – kevpie

+0

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

Répondre

22

Je n'ai pas fait timings, mais vous ne pourrez probablement pas obtenir beaucoup mieux que

for d in my_dicts: 
    d.update((k, "value3") for k, v in d.iteritems() if v == "value2") 

mise à jour pour python3

for d in my_dicts: 
    d.update((k, "value3") for k, v in d.items() if v == "value2") 
0

Edit:

Or.

for item in my_dicts: 
    my_dict[item]['key2'] = 'value3' 
+0

-1 Suppose qu'il est stocké sous une certaine clé. – martineau

+0

@martineau, même s'il est peu probable que le PO le veuille, la question est si peu claire ... de toute façon, @jakob, notez qu'il n'est pas nécessaire d'énumérer une liste pour accéder à ses éléments. – tokland

+0

Que doit faire ce code? Que signifie 'my_dict [item]', où 'item' est un élément de' my_dicts'? –

1

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