from itertools import groupby from operator import itemgetter data = """ a 10 b 2 a 9 c 8 b 3 c 6 """ records = [(x, int(y)) for (x, y) in (line.split() for line in data.strip().splitlines())] # -> [('a', 10), ('b', 2), ('a', 9), ('c', 8), ('b', 3), ('c', 6)] grouped = [(k, map(itemgetter(1), g)) for k, g in groupby(sorted(records, key=itemgetter(0)), key=itemgetter(0))] # -> [('a', [10, 9]), ('b', [2, 3]), ('c', [8, 6])] result = [(x, float(sum(ys))/len(ys)) for x, ys in grouped] # -> [('a', 9.5), ('b', 2.5), ('c', 7.0)]