按优先级排序列表

时间:2021-05-24 22:10:21

标签: python list sorting set priority-queue

我如何定义一个函数 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

但是测试 priority_sort([1, 5, 5, 5, 5, 2, 1], {1, 5}) == [1, 1, 5, 5, 5, 5, 2] return False< /p>

2 个答案:

答案 0 :(得分:0)

这似乎可以解决问题:

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 减去最小值。

答案 1 :(得分:-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]