按优先级对列表排序



如何定义函数priority_sort((,该函数返回一个按升序排列的列表,但将集合中的元素优先于列表中的其他项目。

如果列表为空,则返回一个空列表。如果该集合为空,则没有什么可优先排序的内容,但列表仍应进行排序。该集合可能包含不在列表中的值。该列表可能包含重复项。列表和集合将只包含整数值。

示例

priority_sort([], {2, 3}) == []
priority_sort([], {}) == []
priority_sort([1, 2, 3], {}) == [1, 2, 3]
priority_sort([5, 4, 3, 2, 1], {3, 6}) == [3, 1, 2, 4, 5]
priority_sort([1, 5, 5, 5, 5, 2, 1], {1, 5}) == [1, 1, 5, 5, 5, 5, 2]
priority_sort([-5, -4, -3, -2, -1, 0], {-4, -3}) == [-4, -3, -5, -2, -1, 0]

我的代码

def priority_sort(unsort_lst, pri_set):
pri_set1 = list(pri_set)
new_list = sorted([i for i in unsort_lst if not i in pri_set1])
if unsort_lst == []:
return []
for i in pri_set1:
if i not in unsort_lst:
pri_set1.remove(i)
return pri_set1 + new_list

但测试优先级排序([1,5,5,5,5,5,2,1],{1,5}(=[1,1,5,5,5,2]返回错误

这似乎奏效了:

def priority_sort(items, priorities):
def get_score(item):
if item in priorities:
return min_val - 1
else:
return item
if not items:
return items
min_val = min(items)
items = sorted(items)
return sorted(items, key=get_score)


assert priority_sort([], {2, 3}) == []
assert priority_sort([], {}) == []
assert priority_sort([1, 2, 3], {}) == [1, 2, 3]
assert priority_sort([5, 4, 3, 2, 1], {3, 6}) == [3, 1, 2, 4, 5]
assert priority_sort([1, 5, 5, 5, 5, 2, 1], {1, 5}) == [1, 1, 5, 5, 5, 5, 2]
assert priority_sort([-5, -4, -3, -2, -1, 0], {-4, -3}) == [-4, -3, -5, -2, -1, 0]

它是如何工作的?我们先正常排序,然后处理优先级。每个元素都会被评分,如果该元素是优先的,它会得到最低的分数,这个分数是1减去最低的分数。

您只需制作两个列表,分别对它们进行排序,然后连接:

>>> xs = [-5, -4, -3, -2, -1, 0]
>>> S = {-4, -3}
>>> in_S = [x for x in xs if x in S]
>>> not_in_S = [x for x in xs if not x in S]
>>> list(sorted(in_S)) + list(sorted(not_in_S))
[-4, -3, -5, -2, -1, 0]

或者,您可以定义一个自定义比较函数,将每个值映射到一个元组,其中第一个元素是表示值是否在集合中的布尔值,第二个元素是值本身:

>>> list(sorted(xs, key=lambda x: (not x in S, x)))
[-4, -3, -5, -2, -1, 0]

最新更新