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

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

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

將'value2'的所有實例替換爲'value3'的最有效方法是什麼?編輯詞典列表中的值?

+0

正在尋找'value2'在不同'keyX'內?您將執行多少次更新,每次遍歷只有一次? – kevpie 2010-11-27 12:23:34

+0

可以做出什麼假設 - 就像它總是與同一個關鍵字相關聯,或者它可能出現在其他或多個關鍵字下?你會想要一次更新多個值嗎? – martineau 2010-11-27 12:31:01

回答

22

我沒有做任何時刻,但你可能無法得到更好的比

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

更新Python3

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

編輯:

或者。

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

下面是一個非常普遍的答案,旨在處理大型詞典中多個值的多次出現。處理更簡單的更具體的案例和/或小字典 - 比如你的例子 - 可以更快地完成。

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