假设我有一个自定义数据结构Data
,它揭示了两个相关属性:tag
指示该项目属于哪个等价类,并rank
指示该项目有多好。
我有一组无序的Data
对象,并且想要检索n
最高的对象rank
- 但每个等价类最多有一个对象。
(同一等价类中的对象不一定比较相等,也不一定具有相同的rank
,但我不希望输出中的任何两个元素来自同一类。换句话说,产生的关系这些等价类不是==
。)
我的第一种方法看起来像这样:
- 按降序对列表进行排序
rank
- 创建一个空集
s
- 对于列表中的每个元素:
- 检查它
tag
是否在s
;如果是这样,请继续 - 将其添加
tag
到s
- 产生那个元素
- 如果我们已经产生了
n
元素,请停止
- 检查它
但是,这感觉很尴尬,好像应该有一些更好的方法(可能使用itertools
高阶函数)。结果n
元素的顺序并不重要。
这个问题的 Pythonic 解决方案是什么?
玩具示例:
Data = namedtuple('Data', ('tag', 'rank'))
n = 3
algorithm_input = { Data('a', 200), Data('a', 100), Data('b', 50), Data('c', 10), Data('d', 5) }
expected_output = { Data('a', 200), Data('b', 50), Data('c', 10) }