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为列表中的每个值返回一个元组。然后这些元组用于通知排序顺序。因此,排序算法不是将
python从词典的角度对元组进行排序,也就是说,首先比较两个元组的第一个元素,然后如果它们相同,继续比较第二个元素,等等,直到没有要比较的元素为止。
因为元组同时包含长度和字符串本身,所以对于长度相等的字符串,接下来将根据其实际值对字符串进行排序。这将在末尾放置较长的字符串,在前面放置较短的字符串,并且在每个长度相等的组中,字符串按其值排序。
再次查看您的输入示例,对于
如果没有这种连接断开器(因此键是相等的),python将保持相对顺序不变。在第一个例子中,排序键仅仅是
元组、列表和字符串比较它们的"词典编纂顺序(维基百科链接)"。这意味着他们从左边开始比较元素是否相等。一旦一个元素不相等,他们就会比较这个元素是小的还是大的。
在第二个
这大致相当于先按长度排序,然后按字符串表示:
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'] |