拉姆达排序列表奇怪的行为

问题描述:

当我排序列表(元组)第一和第二个元素,它的工作原理,但第三个元素排序不能正常工作更多 输入:拉姆达排序列表奇怪的行为

mylist=[('11', '82075.36', '8.15'), ('16', '82073.78', '12.92'), ('13', '62077.99', '17.89'),] 

要求:

print(sorted(mylist, key=lambda val: val[0])) 
print(sorted(mylist, key=lambda val: val[1])) 
print(sorted(mylist, key=lambda val: val[2])) 

和输出:

[('11', '82075.36', '8.15'), ('13', '62077.99', '17.89'), ('16', '82073.78', '12.92')] # it is OK 

[('13', '62077.99', '17.89'), ('16', '82073.78', '12.92'), ('11', '82075.36', '8.15')] # it is OK` 

[('16', '82073.78', '12.92'), ('13', '62077.99', '17.89'), ('11', '82075.36', '8.15')] # this seems to be not correct, can anybody explain why? 

,如果我从第三榆树它的工作原理,无论如何,对于榆树1它的工作原理删除引号而不删除引号

mylist=[('11', '82075.36', 8.15), ('16', '82073.78', 12.92), ('13', '62077.99', 17.89),] 

和输出:

[('11', '82075.36', 8.15), ('16', '82073.78', 12.92), ('13', '62077.99', 17.89)] 

你要求对字符串进行排序,所以你得到字符串排序。试试这个:

print(sorted(mylist, key=lambda val: int(val[0]))) 
print(sorted(mylist, key=lambda val: float(val[1]))) 
print(sorted(mylist, key=lambda val: float(val[2]))) 

即,将排序键更改为数字。

字典顺序与数字顺序不同。 '70' < '9'为真,但70 < 9为假。如果你想比较字符串项目作为数字,你必须明确这样做。

print(sorted(mylist, key=lambda val: int(val[0]))) 

由于您使用的字符串,而不是浮动值:如漂浮8.15<12.92,但作为字符串 - 不,因为ord('8')>ord('1')

这是初学者常见的问题。您正在排序“ascii-betically”而不是数字。 (1,2,3)和(“1”,“2”,“3”)是不同的,因为一个是整数元组,另一个是字符串元组。

ASCII代码(和Unicode等)的定义方式是0,1,2,... 9都是“增加”顺序。这意味着“foo1”和“foo2”将按字符串排序,看起来像是正确的序列。

但是,当数字长度不同时,将数字排序为字符串失败。例如,哪一个更大,“9”还是“10”?那么,作为一个字符串,“1”在“9”之前,所以序列是“10”,“9”。但作为整数,它将是9,10。

这就是为什么人们使用数字的文件名总是使用前导零。因为文件名被排序为字符串,所以“009”和“100”以正确的顺序显示,但“9”和“100”不显示!

因此,要回答您的原始问题,您的前两组数据的数字始终保持相同的长度,包括小数点前部分的长度。第三栏有“8.15”和“12.92”,正如上面所解释的那样,那里就会导致它失败。