拉姆达排序列表奇怪的行为
问题描述:
当我排序列表(元组)第一和第二个元素,它的工作原理,但第三个元素排序不能正常工作更多 输入:拉姆达排序列表奇怪的行为
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”,正如上面所解释的那样,那里就会导致它失败。