假设我有一个定制的数据结构Data
,它显示了两个相关的属性:tag
表示这个项属于哪个等价类,rank
表示这个项有多好。你知道吗
我有一个无序的Data
对象集,希望检索具有最高rank
的n
对象,但每个等价类中最多有一个对象。你知道吗
(同一等价类中的对象不一定比较相等,也不一定具有相同的rank
,但我不希望输出中的任何两个元素来自同一类。换句话说,产生这些等价类的关系不是==
。)
我的第一种方法是这样的:
rank
s
tag
是否在s
;如果是,继续tag
添加到s
n
元素,请停止但是,这感觉很尴尬,好像应该有更好的方法(可能使用itertools
和高阶函数)。结果n
元素的顺序并不重要。你知道吗
玩具示例:
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) }
我认为取每个组的max元素(
O(|elements|)
),然后取n个最大的列(O(|groups|.lg n)
,堆的大小是n
),而不是先排序(O(|elements|.lg |elements|)
),然后取n
元素(O(|elements|)
):创建一个dict
max_by_tag
,用于存储带有max rank by标记的项:然后使用^{} 模块:
您可以使用
itertools.groupby
(doc)。首先,我们按您的条件对项目进行排序,然后按标记对它们进行分组(并且只存储每组中的第一个项目):印刷品:
编辑:更改排序键。你知道吗
将排序后的输入存储在
OrderedDict
(以tag
作为键,Data
作为值)。这将导致每个等价类中只有一个Data
存储在OrderedDict
相关问题 更多 >
编程相关推荐