Это немного запутанно, но вы можете сделать это с помощью функции itertools.groupby:
>>> lst = [(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1),
(10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)]
>>> from operator import itemgetter
>>> import itertools
>>> [map(itemgetter(0), group) for (key,group) in itertools.groupby(lst, itemgetter(1))]
[[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]]
>>>
Пояснение:
groupby возвращает итератор для каждой группы, где группа определяется как последовательность записей, которые имеют одинаковое значение, возвращаемое функцией, передаваемой в качестве отдельного параметра. itemgetter (1) генерирует функцию, которая возвращает x [1] при вызове с аргументом x.
Поскольку итератор groupby возвращает два значения - ключ, который использовался, и последовательности исходных значений, которые являются кортежами, нам необходимо выделить второе значение в каждом кортеже, что и делает map (itemgetter (0), group).