下面的函数(sort_priority_0)对数字列表进行排序,但优先处理一组数字,使其排在最前面。 return语句中元组的目的是什么?
numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
def sort_priority_0(values, group):
def helper(x):
if x in group:
return 0, x
return 1, x
values.sort(key=helper)
python sort_priority_0.py
[2, 3, 5, 7, 1, 4, 6, 8]
如果我修改函数并删除元组,则排序按升序进行。请解释为什么在return语句中有和没有元组的情况下,这种行为有如此大的不同?
def sort_priority_1(values, group):
def helper(x):
if x in group:
return x
return x
values.sort(key=helper)
python sort_priority.py
[1, 2, 3, 4, 5, 6, 7, 8]
答案 0 :(得分:2)
key
中的sort
参数具有一个功能。您可以这样想:如果提供了key
,则可迭代输入将被排序,就像将key
应用于每个元素一样。
tuples
按其第一个元素排序,然后按其第二个元素排序,依此类推。在这种情况下,键函数会将可迭代的所有元素转换为tuples
,如果数字在优先级组中,则第一个元素为0,否则为1。
这意味着,由于sort
在默认情况下是升序的,因此所有优先级数字都将排在最前面,并且它们在内部将按照升序排序。
为说明起见,您可以认为该过程具有以下步骤:
[8, 3, 1, 2, 5, 4, 7, 6]
开头key
可获得:[(1, 8), (0, 3), (1, 1), (0, 2), (0, 5), (1, 4), (0, 7), (1, 6)]
[(0, 2), (0, 3), (0, 5), (0, 7), (1, 1), (1, 4), (1, 6), (1, 8)]
tuple
的第二个元素,尽管因为它是基于索引的,所以不必从键函数的输出中恢复原始元素): [2, 3, 5, 7, 1, 4, 6, 8]
答案 1 :(得分:0)
helper
中的sort_priority_0
函数可确保首先以升序对组中的元素进行排序,然后按照升序对其余元素进行排序,如下所示。 / p>
print(sort_priority_0(numbers,{2, 3, 5, 7}))
#[2, 3, 5, 7, 1, 4, 6, 8]
print(sort_priority_0(numbers,{4, 2, 5, 8}))
#[2, 4, 5, 8, 1, 3, 6, 7]
print(sort_priority_0(numbers,{6, 4, 5, 1}))
#[1, 4, 5, 6, 2, 3, 7, 8]
为组中的元素返回0,x
可以确保在排序时将这些元素推到列表的前面,并通过1,x
将其余的元素推到列表的后半部分,然后按升序排序,因为排序发生在0
和1
上,然后在数字内