您已经实现了我能想到的最简单的方法。我要做的唯一改变是循环——一个稍微更简洁的版本是使用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)]