自定义键(助手)排序功能说明



我在最近观看的教程中遇到了以下示例。

我们要对这些数字进行排序:

numbers = [8, 3, 1, 2, 5, 4, 7, 6]

优先考虑属于以下组的人:

group = {2, 3, 5, 7}

所以作者实现的辅助(排序键(函数如下:

def helper(x):
    if x in group:
        return (0, x)
    return (1, x)

它通过调用进行排序

numbers.sort(key=helper)

我似乎无法理解这个return (0,x)与。 return (1,x)这很可能是很容易解释的(但也许我缺少一个关于排序助手函数如何工作的元素(

该关键函数的作用是,而不是比较

[8, 3, 1, 2, 5, 4, 7, 6]

它比较

[(0, 8), (1, 3), (0, 1), (1, 2), (1, 5), (0, 4), (1, 7), (0, 6)]

元组按字典顺序排序,这意味着首先比较第一个元素。 如果它们不同,则停止比较。 如果它们相同,则比较第二个元素。

这样做的效果是将所有group数字放在前面(按数字顺序(,然后是其余数字(也按数字顺序(。

嗯,(0, x)(1, x)小。简而言之,Python 将首先比较第一个元素,如果它们相同,那么第二个,然后是第三个......

够清楚吗?我的意思是,在您的示例中,该组中的所有元素都将被视为小于不在该组中的元素。

当下一行执行numbers.sort(key=helper)时,迭代器会迭代列表的每个元素number
迭代时,对于每个元素,它会使用该元素调用 helper 方法。
如果此元素是组的一部分,则返回(0, element)
如果它不是组的一部分,则返回(1, element)
现在,在排序时,要排序的元素[(0,x), (1,x), (0,x)...]而不是实际元素。
它比较列表中的两个元组,并检查值是>还是<=
在比较两个元组时,它首先根据每个元素中第 0 个索引处的值来比较它们。
然后它根据列表每个元素中的第一个值比较它们,依此类推。
这将产生以下输出:

>>> numbers
[2, 3, 5, 7, 1, 4, 6, 8]

如果每个元素的第一个索引处都有字符,则会根据其 ASCII 值对它们进行排序。

最新更新