【问题标题】:Python: sorting list of lists not functioning as intendedPython:列表的排序列表未按预期运行
【发布时间】:2016-07-21 13:09:06
【问题描述】:

我正在尝试按每个列表的第一项升序对以下列表列表进行排序:

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]]

怎么了?

【问题讨论】:

  • 没有错。结果是您发布的代码行的预期结果。字符串按词法顺序排序,因此 '1468'

标签: python list sorting lambda


【解决方案1】:

您的值是字符串,因此您正在排序lexicographically,而不是数字。 '1468' 排在'195' 之前,因为在ASCII 标准中'4' 排在'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]]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 2018-06-09
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多