You can merge by using defaultdict:
>>> l = [('a', 'b', 'c', [(1, 2),(2, 3),(3, 4)]),
... ('a', 'b', 'c', [(1, 1),(2, 4),(3, 6)]),
... ('a', 'b', 'd', [(1, 3),(2, 6),(3, 7)]),
... ('a', 'b', 'd', [(1, 7),(2, 8),(3, 9)])]
>>> d = defaultdict(lambda:defaultdict(list))
>>> for k1,k2,k3, lst in l:
... for t in lst:
... d[(k1,k2,k3)][t[0]].append(t[1])
result:
>>> d
defaultdict(<function <lambda> at 0x8e33e9c>,
{('a', 'b', 'c'): defaultdict(<type 'list'>, {1: [2, 1], 2: [3, 4], 3: [4, 6]}),
('a', 'b', 'd'): defaultdict(<type 'list'>, {1: [3, 7], 2: [6, 8], 3: [7, 9]})})
if you need it in list:
>>> [(k, v.items()) for k,v in d.items()]
[(('a', 'b', 'c'), [(1, [2, 1]), (2, [3, 4]), (3, [4, 6])]),
(('a', 'b', 'd'), [(1, [3, 7]), (2, [6, 8]), (3, [7, 9])])]
with mean calculation:
>>> [(k, [(n, sum(t)/float(len(t))) for n,t in v.items()]) for k,v in d.items()]
[(('a', 'b', 'c'), [(1, 1.5), (2, 3.5), (3, 5.0)]),
(('a', 'b', 'd'), [(1, 5.0), (2, 7.0), (3, 8.0)])]