这个用于排序数字的lambda如何工作?

Man*_*aju 5 python sorting lambda python-2.7

#code for sorting big integers
lis = ['234', '5', '2', '12435645758']

lis.sort(key = lambda x: len(x))
print lis
#output ['5', '2', '234', '12435645758']

lis.sort(key = lambda x: (len(x), x))
print lis
#output ['2', '5', '234', '12435645758']
Run Code Online (Sandbox Code Playgroud)

我试图在Python中对大数字字符串进行排序而不将字符串转换为整数,并且无法理解如何评估这些lambda表达式.

第一个lambda表达式是基于字符串的长度排序并对列表进行排序,但第二个表达式是什么?我想知道如何评估第二个lambda表达式.

Mar*_*ers 2

lambda 为列表中的每个值返回一个元组。然后使用这些元组来通知排序顺序。因此,排序算法不要求'234'比较,而是比较和。'5'(3, '234')(1, '5')

Python 按字典顺序对元组进行排序,也就是说,首先比较两个元组的第一个元素,如果相同,则继续比较第二个元素,依此类推,直到没有可比较的元素为止。

由于元组同时保存长度和字符串本身,因此对于长度相等的字符串,接下来将根据其实际值对字符串进行排序。这会将较长的字符串放在末尾,较短的字符串放在前面,并且在每个相同长度的组中,字符串按其值排序。

再次查看您的输入示例,对于'234''5',生成的元组(3, '234')(1, '5')具有不相等的第一个元素,因此(1, '5')在 之前排序(3, '234')。但是对于'5'and '2',生成的元组是(1, '5')and (1, '2')(两者都是 1 个字符长),并且这些元组的第一个元素相等。因此它们会按第二个元素排序,放在'2'之前'5'

如果没有这样的平局断路器(因此键相等),Python 会保持相对顺序不变。对于第一个示例,排序键仅仅是len(x),并且由于'5''2'具有相同的长度,并且没有其他东西可以比较它们,Python 将它们以相同的相对顺序放入输出中,'5'在 之前'2'