Eräs usein toistuva ohjelmointiprobleema on laskea yhteen usean eri dictionary-objektin sisältämien avainarvoparien summat.

Lähtökohtana voivat olla vaikkapa tällaiset objektit:

values1 = {'small':10, 'medium':20, 'large':30}
values2 = {'medium':50}
values3 = {'large':100}

Miten näistä saadaan helpoiten yhdistettyä yksi objekti, joka sisältää nämä yhteenlasketut arvot?

{'small':10, 'medium':70, 'large':130}

Python 2.7 tarjoaa tähän kätevän Counter-luokan, jolla voidaan suorittaa kyseiset laskutoimitukset suoraan +-operaatioina:

from collections import Counter
print dict(Counter(values1) + Counter(values2) + Counter(values3))
{'large': 130, 'medium': 70, 'small': 10}

Huomaa, että Counter on dict-luokan aliluokka, joten sitä voi halutessaan käyttää sellaisenaan tai helposti muuttaa takaisin dict-luokaksi.

Jos dictionaryja on vaihteleva määrä, ne voi laskea yhteen myös reduce-funktiolla näin:

all_values = [values1, values2, values3]
print dict(reduce(lambda x,y:x+y, [Counter(values) for values in all_values]))
{'small': 10, 'large': 130, 'medium': 70}
Published 15.2.2012