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

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

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

¿Cuál sería la forma más eficiente de reemplazar todas las instancias de 'valor2' por 'valor3'?¿Editar los valores en una lista de diccionarios?

+0

¿Está buscando 'value2' dentro de 'keyX'? ¿Cuántas actualizaciones va a realizar, solo una por recorrido? – kevpie

+0

¿Qué suposiciones se pueden hacer, como siempre se asociará con la misma clave, o puede ocurrir bajo otras o múltiples claves? ¿Alguna vez querrá actualizar más de un valor a la vez? – martineau

Respuesta

22

no hice ningún tiempos, pero es probable que no se puede conseguir mucho mejor que

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

Actualización para python3

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

Editar:

O.

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

-1 Asume que está almacenado bajo una determinada clave. – martineau

+0

@martineau, aunque es poco probable que eso sea lo que quiere el OP, la pregunta es muy poco clara ... de todos modos, @jakob, tenga en cuenta que no es necesario enumerar una lista para acceder a sus elementos. – tokland

+0

¿Qué se supone que debe hacer este código? ¿Qué significa 'my_dict [item]', donde 'item' es algún elemento de' my_dicts'? –

1

Aquí hay una respuesta muy general diseñada para manejar múltiples ocurrencias de valores múltiples en diccionarios grandes. Manejar casos más específicos más simples y/o con diccionarios pequeños, como su ejemplo, podría hacerse mucho más rápido.

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