For starters, I'm going to get all1ts
in a much shorter way:
import itertools
all1ts = sorted(itertools.chain(((m, "m1") for m in m1),
((w, "w1") for w in w1)))
all1tsr = [row+(i,) for i,row in enumerate(all1ts)]
Then I'm going to use itertools.groupby
, which is basically designed for doing things like this.
groups = []
for _, group in itertools.groupby(all1tsr, lambda x: x[0]):
group = list(group)
rank = sum(x[2] for x in group) / len(group)
groups.extend((val, identifier, rank) for val, identifier, _ in group)
Running on your test data gives me this result:
[(0, 'm1', 5),
(0, 'm1', 5),
(0, 'm1', 5),
(0, 'm1', 5),
(0, 'm1', 5),
(0, 'w1', 5),
(0, 'w1', 5),
(0, 'w1', 5),
(0, 'w1', 5),
(0, 'w1', 5),
(0, 'w1', 5),
(1, 'w1', 11),
(2, 'm1', 12),
(3, 'm1', 16),
(3, 'm1', 16),
(3, 'm1', 16),
(3, 'w1', 16),
(3, 'w1', 16),
(3, 'w1', 16),
(3, 'w1', 16),
(4, 'm1', 20),
(4, 'm1', 20),
(5, 'm1', 22),
(6, 'm1', 23),
(7, 'w1', 24),
(8, 'w1', 25),
(8, 'w1', 25),
(10, 'm1', 28),
(10, 'm1', 28),
(10, 'm1', 28),
(11, 'm1', 30),
(12, 'm1', 31),
(15, 'm1', 33),
(15, 'm1', 33),
(15, 'm1', 33),
(19, 'w1', 35),
(20, 'm1', 36),
(20, 'w1', 36),
(22, 'm1', 38),
(25, 'm1', 39),
(25, 'm1', 39),
(27, 'm1', 41),
(27, 'w1', 41),
(30, 'm1', 43),
(30, 'w1', 43)]
Which I think is what you want.