我在最近观看的教程中遇到了以下示例。
我们要对这些数字进行排序:
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 值对它们进行排序。