Вы уже реализовали самый простой подход, который я могу придумать.Единственное изменение, которое я бы сделал, - это цикл - чуть более краткая версия использует min
.
seen = defaultdict(lambda: 1) # `lambda: float('inf')` if scores can be > 1
for score, url in s:
seen[url] = min(seen[url], score)
{(v,k) for k,v in seen.items()}
# {(0.33, 'http://www.bar.com'), (0.5, 'http://www.foo.com')}
Если вы действительно хотите более короткое решение, как я уже сказал, это не так.Это не самый простой подход, но это один вкладыш.Большая часть проблемы заключается в обмене URL-адресом и оценкой, чтобы вы могли использовать URL-адрес в качестве ключа при удалении дубликатов.Само собой разумеется, что сортировка является предварительным условием (вот почему мне не нравится это решение так же, как приведенное выше).
{(v, k) for k, v in dict(sorted(((v, k) for k, v in s), reverse=True)).items()}
# {(0.33, 'http://www.bar.com'), (0.5, 'http://www.foo.com')}
Это решение становится намного короче, если выглядит s
как это:
s2 = {(v,k) for k, v in s}
s2
# {('http://www.bar.com', 0.33), ('http://www.bar.com', 0.66), ...}
Вам нужно только тогда сделать
list(dict(sorted(s2, reverse=True)).items())
# [('http://www.foo.com', 0.5), ('http://www.bar.com', 0.33)]