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

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

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

Jaki byłby najskuteczniejszy sposób zastąpienia wszystkich wystąpień "value2" przez "value3"?Edytować wartości na liście słowników?

+0

Szukasz "wartości 2" w ramach różnych "kluczy X"? Ile aktualizacji będziesz wykonywał, po jednym na każde przejście? – kevpie

+0

Jakie założenia można sformułować - na przykład czy będzie zawsze kojarzony z tym samym kluczem, czy może występować pod innymi lub wieloma kluczami? Czy kiedykolwiek chcesz aktualizować więcej niż jedną wartość naraz? – martineau

Odpowiedz

22

nie zrobiłem żadnych czasowych, ale prawdopodobnie nie można uzyskać znacznie lepsze niż

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

Aktualizacja dla Python3

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

Edycja:

Or.

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

-1 Zakłada, że ​​jest przechowywany pod określonym kluczem. – martineau

+0

@martineau, chociaż jest mało prawdopodobne, że to, co chce OP, pytanie jest tak niejasne ... w każdym razie, @jakob, zauważ, że nie jest konieczne wyliczenie listy, aby uzyskać dostęp do jej elementów. – tokland

+0

Co ten kod ma zrobić? Co oznacza 'my_dict [element]', gdzie 'item' jest jakimś elementem' my_dicts'? –

1

Oto bardzo ogólna odpowiedź przeznaczona do obsługi wielokrotnych wystąpień wielu wartości w dużych słownikach. Obsługa prostszych, bardziej szczegółowych przypadków i/lub małych słowników - jak na przykład - może być wykonana znacznie szybciej.

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'}] 
Powiązane problemy