当我按列表(元组)中的第一个和第二个元素排序时,它可以工作,但按第三个元素排序不再有效 输入:
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)]
答案 0 :(得分:1)
您要求对字符串进行排序,以便您进行字符串排序。试试这个:
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])))
即。将排序键更改为数字。
答案 1 :(得分:0)
词典顺序与数字顺序不同。 '70' < '9'
为真,但70 < 9
为假。如果要将字符串项目作为数字进行比较,则必须明确地这样做。
print(sorted(mylist, key=lambda val: int(val[0])))
答案 2 :(得分:0)
因为你使用string而不是float值:as float 8.15<12.92
,但是作为字符串 - 不是,因为ord('8')>ord('1')
。
答案 3 :(得分:0)
这是初学者的常见问题。你正在排序&#34; ascii-betically&#34;而不是数字。
即,(1,2,3)和(&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;)是不同的,因为一个是元组整数,而另一个是字符串元组。
ASCII代码(和Unicode等)的定义方式是0,1,2,... 9都在&#34;增加&#34;订购。这意味着&#34; foo1&#34;和&#34; foo2&#34;将作为字符串排序成似乎正确的序列。
但是当数字长度不同时,将数字排序为字符串会失败。例如,哪一个更大,&#34; 9&#34;或&#34; 10&#34;?好吧,作为一个字符串,&#34; 1&#34;来到&#34; 9&#34;之前,序列是&#34; 10&#34;,&#34; 9&#34;。但作为整数,它将是9,10。
这就是人们制作带有数字的文件名总是使用前导零的原因。因为文件名被排序为字符串,所以&#34; 009&#34;和&#34; 100&#34;以正确的顺序出现,但&#34; 9&#34;和&#34; 100&#34;别&#39;!吨
因此,为了回答您的原始问题,您的前两组数据的长度始终相同,包括小数点前部分的长度。第三栏有&#34; 8.15&#34;和&#34; 12.92&#34;,正确的话会导致它失败,如上所述。