python helper函数和return语句

时间:2019-04-22 05:34:12

标签: python sorting tuples return-value

下面的函数(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]

2 个答案:

答案 0 :(得分:2)

key中的sort参数具有一个功能。您可以这样想:如果提供了key,则可迭代输入将被排序,就像将key应用于每个元素一样。

tuples按其第一个元素排序,然后按其第二个元素排序,依此类推。在这种情况下,键函数会将可迭代的所有元素转换为tuples,如果数字在优先级组中,则第一个元素为0,否则为1。

这意味着,由于sort在默认情况下是升序的,因此所有优先级数字都将排在最前面,并且它们在内部将按照升序排序。

为说明起见,您可以认为该过程具有以下步骤:

  1. [8, 3, 1, 2, 5, 4, 7, 6]开头
  2. 应用key可获得:
[(1, 8), (0, 3), (1, 1), (0, 2), (0, 5), (1, 4), (0, 7), (1, 6)]
  1. 按升序排列结果以得到:
[(0, 2), (0, 3), (0, 5), (0, 7), (1, 1), (1, 4), (1, 6), (1, 8)]
  1. 获取原始数据的相应元素(在这种情况下,为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将其余的元素推到列表的后半部分,然后按升序排序,因为排序发生在01上,然后在数字内