Удалить одинаковые элементы по одному элементу кортежа и меньшими по другому
Есть список кортежей, в котором, в каждом кортеже есть два целочисленные значения, возраст и количество.
Нужно удалить из списка одинаковые кортежи по возрасту, но оставить самые большие по количеству.
Вот сам список:
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())