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

How does this lambda for sorting numbers work?

1
2
3
4
5
6
7
8
9
10
#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']

我试图在不将字符串转换为整数的情况下对python中的大数字符串进行排序,但无法理解如何计算这些lambda表达式。

第一个lambda表达式基于字符串长度进行排序并对列表进行排序,但是第二个表达式做什么呢?我想知道如何计算第二个lambda表达式。


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

python从词典的角度对元组进行排序,也就是说,首先比较两个元组的第一个元素,然后如果它们相同,继续比较第二个元素,等等,直到没有要比较的元素为止。

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

再次查看您的输入示例,对于'234''5',结果的元组(3, '234')(1, '5')具有不同的第一个元素,因此(1, '5')(3, '234')之前排序。但是对于'5''2'来说,得到的元组是(1, '5')(1, '2')(都是1个字符长),这些元组的第一个元素是相等的。因此,将它们排序到第二个元素上,将'2'放在'5'之前。

如果没有这种连接断开器(因此键是相等的),python将保持相对顺序不变。在第一个例子中,排序键仅仅是len(x),由于'5''2'的长度相同,而且没有其他可供比较的内容,所以python将它们按相同的相对顺序放入输出中,'5''2'之前。


元组、列表和字符串比较它们的"词典编纂顺序(维基百科链接)"。这意味着他们从左边开始比较元素是否相等。一旦一个元素不相等,他们就会比较这个元素是小的还是大的。

在第二个sort中,创建一个包含长度和字符串的元组。因此,如果你比较两个元素,它会检查:如果长度不相等,则较短的元素会被认为是"较小的"。如果长度等于数字,则下"字符串表示"为"较小"。

这大致相当于先按长度排序,然后按字符串表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lis = ['234', '5', '2', '12435645758']

class StringInteger(object):
    def __init__(self, string):
        self.string = string

    def __lt__(self, other):  
       """ that's the method that implements"smaller than": < comparisons."""
        # check if the lengths are equal
        if len(self.string) == len(other.string):
            # lengths are equal, so compare the strings
            return self.string < other.string
        else:
            # lengths are not equal, compare the lengths
            return len(self.string) < len(other.string)

sorted(lis, key=StringInteger)  # ['2', '5', '234', '12435645758']