ZILosoft
@ZILosoft
SysAdmin

Как удалить повторяющися значения но оставить самый первый?

У Меня есть список
id,symbol,rank
(36, 'abc', 5158)
(35, 'aaa', 4023)
(44, 'aaa', 3756)
(171, 'alc', 3262)
(179, 'soc', 701)
(42, 'abs', 3879)
(43, 'abs', 531)

мне нужно удалить повторяющиеся значения symbol но оставить то у которого поле rank больше остальных
как здесь

id,symbol,rank
(36, 'abc', 5158)
(35, 'aaa', 4023)
(171, 'alc', 3262)
(179, 'soc', 701)
(42, 'abs', 3879)

как это сделать?
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
from itertools import groupby
from operator import itemgetter

# sid, symbol, rank
data = [
    (36, 'abc', 5158),
    (35, 'aaa', 4023),
    (44, 'aaa', 3756),
    (171, 'alc', 3262),
    (179, 'soc', 701),
    (42, 'abs', 3879),
    (43, 'abs', 531),
]

def max_unique_rank(data):
    _sid, _symbol, _rank = range(3)
    filtered = sorted(data, key=itemgetter(_symbol, _rank), reverse=True)
    filtered = groupby(filtered, key=itemgetter(_symbol))
    filtered = [next(group) for _, group in filtered]
    return filtered

max_unique_rank(data)

Результат:
[(179, 'soc', 701),
 (171, 'alc', 3262),
 (42, 'abs', 3879),
 (36, 'abc', 5158),
 (35, 'aaa', 4023)]

Вариант с сохранением порядка и прозрачной логикой:
cache = {}
for sid, symbol, rank in data:
    _sid, _rank = cache.get(symbol, (sid, rank))
    if _rank <= rank:
        cache[symbol] = (sid, rank)
filtered = [(sid, symbol, rank) for symbol, (sid, rank) in cache.items()]

Одной строкой:
{symbol: (sid, symbol, rank) for sid, symbol, rank in sorted(data, key=itemgetter(2))}.values()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Простое решение в лоб:
ddd
[(36, 'abc', 5158), (35, 'aaa', 4023), (44, 'aaa', 3756), (171, 'alc', 3262), (179, 'soc', 701), (42, 'abs', 3879), (43, 'abs', 531)]
ddd.sort(key=lambda x: x[-1])
ddd
[(43, 'abs', 531), (179, 'soc', 701), (171, 'alc', 3262), (44, 'aaa', 3756), (42, 'abs', 3879), (35, 'aaa', 4023), (36, 'abc', 5158)]
t = {v[-1]: v for v in ddd}
t
{531: (43, 'abs', 531), 701: (179, 'soc', 701), 3262: (171, 'alc', 3262), 3756: (44, 'aaa', 3756), 3879: (42, 'abs', 3879), 4023: (35, 'aaa', 4023), 5158: (36, 'abc', 5158)}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы