Удалить одинаковые элементы по одному элементу кортежа и меньшими по другому

Есть список кортежей, в котором, в каждом кортеже есть два целочисленные значения, возраст и количество.

Нужно удалить из списка одинаковые кортежи по возрасту, но оставить самые большие по количеству.

Вот сам список:

out = [
    (36, 0), (37, 0), (27, 0), (31, 0), (30, 0), (18, 0), (29, 0), (34, 0),
    (32, 0), (23, 0), (27, 0), (20, 0), (25, 0), (40, 0), (29, 0), (19, 0), 
    (26, 0), (21, 0), (21, 1), (20, 1), (26, 1), (20, 1), (35, 1), (19, 1),
    (33, 1), (18, 1), (23, 1), (20, 1), (17, 1), (20, 1), (23, 1), (19, 1),
    (30, 1), (19, 1), (22, 1), (24, 1), (30, 1), (19, 1), (21, 1), (16, 1),
    (62, 1), (17, 1), (17, 2), (17, 3), (17, 4), (20, 4)
]

Например, вот кортежи: (17, 1), (17, 2), (17, 3), (17, 4), из всех кортежей по значению возраста 17. Нужно оставить один со значением количества 4, а все нулевые количества тоже удалить.


Ответы (2 шт):

Автор решения: MaxU

Воспользуйтесь itertools.groupby():

from itertools import groupby

res = [max(g, key=lambda x: x[1])
       for c,g in groupby(sorted([x for x in out if x[1] != 0]), lambda x: x[0])]

результат:

In [18]: res
Out[18]:
[(16, 1),
 (17, 4),
 (18, 1),
 (19, 1),
 (20, 4),
 (21, 1),
 (22, 1),
 (23, 1),
 (24, 1),
 (26, 1),
 (30, 1),
 (33, 1),
 (35, 1),
 (62, 1)]
→ Ссылка
Автор решения: splash58

отсортируйте список, по умолчанию будет сортироваться сначала по первому, а потом по второму членам кортежей. Теперь можно сделать словарь, в нем останутся максимальные значения, и преобразовать обратно в список

newList = list(dict(sorted(out)).items())
→ Ссылка