按优先级排序列表
Sort list by priority
我如何定义函数 priority_sort() return 一个排序列表,其项目按升序排列,但集合中的元素优先于列表中的其他项目。
如果列表为空,return 为空列表。
如果集合为空,则没有什么优先级,但列表仍应排序。
该集合可能包含不在列表中的值。
该列表可能包含重复项。
列表和集合将只包含整数值。
示例
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 错误
你可以只做两个列表,分别排序,然后连接:
>>> 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]
这似乎可以解决问题:
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减去最小值。
我如何定义函数 priority_sort() return 一个排序列表,其项目按升序排列,但集合中的元素优先于列表中的其他项目。
如果列表为空,return 为空列表。 如果集合为空,则没有什么优先级,但列表仍应排序。 该集合可能包含不在列表中的值。 该列表可能包含重复项。 列表和集合将只包含整数值。
示例
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 错误
你可以只做两个列表,分别排序,然后连接:
>>> 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]
这似乎可以解决问题:
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减去最小值。