python sorted方法如何利用键lambda函数返回的元组并优先排序

kxxlusnw  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(116)

例如,下面是一个调用,解释器在按照特定的优先顺序对字符串进行排序时通常会使用这个元组

sorted(s,key = lambda x:(x.isdigit() and int(x)%2==0, x.isdigit(),x.isupper(),x.islower(),x))

但是,当执行以下代码时,会产生以下输出:

这实际上是hackerrank上以下问题的解决方案:https://www.hackerrank.com/challenges/ginorts/problem

k3bvogb1

k3bvogb11#

它将比较lambda与>运算符的结果:

In [1]: (1,2) > (1,4)                                                                                   
Out[1]: False

In [2]: (2,2) > (1,4)                                                                                   
Out[2]: True

In [3]: (True, False) > (True, True)                                                                    
Out[3]: False

这就像比较字符串。第一个不相等的元素决定结果。

kpbwa7wx

kpbwa7wx2#

在列表的每个元素上调用key函数,它返回的值用作排序“键”(即作为比较值,而不是实际的列表元素)。
排序函数等效于:

def sort_key(x: str) -> Tuple[bool, bool, bool, bool, str]:
    return (
        x.isdigit() and int(x) % 2 == 0,
        x.isdigit(),
        x.isupper(),
        x.islower(),
        x
    )

(扩展为带类型注解的函数def,以便我们更好地查看它返回的内容)
所以我可以推断出你的列表是字符串;sorting key函数返回一个包含四个bool值的元组,这些值告诉我们这些字符串的不同属性为True/False值。
1.是个偶数。
1.它是任何一种数字。
1.全是大写字母。
1.全是小写的。
第五个值是字符串本身(将按字母顺序排序),比较元组时,首先比较第一个值,然后比较第二个值,以此类推,比较bool值时,FalseTrue之前,因此排序列表将按顺序分组到上述四个类别中;首先将偶数分组(在列表的末尾,因为TrueFalse之后),然后是奇数,然后是大写字符串,然后是小写字符串,然后是其他所有字符串,在这些类别中,将按照字符串顺序进行排序(按字典顺序)。

相关问题