作为排序函数关键参数的复杂lambda表达式



我有一个示例代码:

In [60]: sorted([3, 1, None], key=lambda x: (x is None, x))
Out[60]: [1, 3, None]
In [61]: sorted([3, 1, None], key=lambda x: (x is not None, x))
Out[61]: [None, 1, 3]

我想我确实理解它的作用-看起来它允许在排序期间跳过键的None值,否则排序将引发TypeError试图将intNone进行比较-但我不明白它是如何以及为什么工作的。特别是,我对返回元组的lambda函数感到困惑。

我在分类HOWTO中找不到任何相关的东西。我希望有一个解释或链接到这个行为的记录。

元组按字典顺序进行比较和排序:

>>> sorted([(0, 17), (1,15), (0,12), (0, 9), (1, 8), (1, 7), (0, 2)])
[(0, 2), (0, 9), (0, 12), (0, 17), (1, 7), (1, 8), (1, 15)]
>>> (0, 12) < (1, 9)
True
>>> (0, 12) < (0, 13)
True
>>> (1, 12) < (0, 9)
False

"辞典编纂的order"是一个花哨的词,表示"像英语字典里的词一样":"先比较第一个字母,只有当第一个字母相等时,再比较第二个字母,只有当前两个字母相等时,再比较第三个字母,等等"。

使用元组作为键,元组也将按字典顺序进行比较。

在您的情况下,x is Nonex is not None求值为布尔值,TrueFalse

布尔值也可以比较:

>>> False < True
True
>>> True < False
False

因此,sorted([3, 1, None], key=lambda x: (x is None, x))将考虑最小的元素是那些x is None为假的元素,而最大的元素是那些x is None为真的元素:

>>> sorted([3, 1, None], key=lambda x: (x is None, x))
[1, 3, None]
>>> sorted(map(lambda x: (x is None, x), [3, 1, None]))
[(False, 1), (False, 3), (True, None)]

sortedkey参数用于对值进行排序,如果有多个元素,则按元素的顺序排列。

您的代码所做的是将None放在首位(或最后),并作为辅助键对非None元素进行排序

第一个键:将[3, 1, None]映射到相当于[0, 0, 1][False, False, True],并将None推到末尾。

第二个关键是打破31之间的联系

相关内容

  • 没有找到相关文章

最新更新