Python:排序列表不按预期运行

时间:2016-07-21 13:09:06

标签: python list sorting lambda

我试图按照每个列表的第一项按升序排列以下列表列表:

framenos = [
    ['1468', '2877', 'Pos.:', 95],
    ['3185', '4339', 'Pos.:', 96],
    ['195', '1460', 'Pos.:', 97]
]

我正在使用以下内容:

framesorted = sorted(framenos, key=lambda x: x[0]) #sort ranges by start numbers

给出了:

[['1468', '2877', 'Pos.:', 95], ['195', '1460', 'Pos.:', 97], ['3185', '4339', 'Pos.:', 96]]

出了什么问题?

2 个答案:

答案 0 :(得分:5)

您的值是字符串,因此您要排序lexicographically,而不是数字。 '1468''195'之前排序,因为'4'在ASCII标准中位于'9'之前,就像'Ask'将在'Attribution'之前排序一样。

如果需要数字排序,请将字符串转换为数字:

framesorted = sorted(framenos, key=lambda x: int(x[0]))

演示:

>>> framenos = [
...     ['1468', '2877', 'Pos.:', 95],
...     ['3185', '4339', 'Pos.:', 96],
...     ['195', '1460', 'Pos.:', 97]
... ]
>>> sorted(framenos, key=lambda x: int(x[0]))
[['195', '1460', 'Pos.:', 97], ['1468', '2877', 'Pos.:', 95], ['3185', '4339', 'Pos.:', 96]]
>>> from pprint import pprint
>>> pprint(_)
[['195', '1460', 'Pos.:', 97],
 ['1468', '2877', 'Pos.:', 95],
 ['3185', '4339', 'Pos.:', 96]]

答案 1 :(得分:0)

由于每个列表的第一个元素是一个字符串,因此按字母顺序对这些数字进行排序。为了根据第一个元素的整数值对这些列表进行排序,请尝试转换为int:

framesorted = sorted(framenos, key=lambda x: int(x[0]))