【问题标题】:Sorting a list of different values by a specific field [duplicate]按特定字段对不同值的列表进行排序[重复]
【发布时间】:2014-08-22 15:14:59
【问题描述】:

我有一个从电子表格中读取的不同类型的列表。

>>>data
[1.0, u'1', u'COMPLETED', u'TONGUE', 30.0, 1.0, '2014/01/28 09:33:16', 30.0, 210.0, u'1 CW', 0.0, 2.0, 210.0, u'H1490']
[1.0, u'1', u'COMPLETED', u'TONGUE', 30.0, 1.0, '04/02/2014 09:14:36', 30.0, 230.0, u'2 CCW', 0.0, 7.0, 210.0, u'H990']
.......

我想按日期排序,即按第 6 个字段(data[1][6],data[2][6] 等)排序。如何指示 Python 按字段编号 6 对该列表进行排序?

【问题讨论】:

  • pass key 使用 lambda 进行排序或排序
  • @Owen 压缩列表与我的要求完全不同
  • 如果没有一致的日期格式,这是非常困难的。 “04/02/2014”晚于还是早于“05/01/2014”?取决于后者是 2014 年 5 月 1 日还是 2014 年 1 月 5 日。
  • YYYYMMDD 样式的日期可以按字典顺序排序,因此在这种情况下您根本不需要进行任何解析。
  • 是的 str 可以按 Kevin 所说的按字典顺序排序,但如果它不是最重要的元素顺序并且每个元素 0 填充到相同的位数,它不会变成你如何想要。

标签: python sorting python-2.7 python-3.x ipython


【解决方案1】:

您可以使用sorted 并指定要按第6 个字段排序。

你可以使用dateutil.parser来解析日期:

import dateutil.parser
sorted(data, key=lambda x: dateutil.parser.parse(x[6]))

或者,如果您想对数据进行就地排序并减少查找次数:

from dateutil.parser import parse
data.sort(key=lambda x: parse(x[6]))

【讨论】:

  • @Ffisegydd 然后编写您自己的函数,返回字符串的可比较日期并将其用作键。
  • @Ffisegydd 我已经根据您的 cmets 更新了我的答案。谢谢!
  • @jh314 这很有用。我可以使用解析器,也可以按照 @_Kevin 之前所说的按字典顺序对它们进行排序
  • @Manolete 很高兴知道它很有用!
【解决方案2】:

使用sorted 使用lambda 作为排序键和dateutil

from dateutil import parser

sorted(data,key = lambda x:parser.parse(x[6]))

如果您没有安装 dateutil:

pip install python-dateutil

如果您想对列表进行就地排序并避免创建新列表:

data.sort(key=lambda x:parser.parse(x[6]))

如果日期是两种不同格式之一,您可以使用自己的函数:

def date_parse(x):
    date = None
    for form in ["%Y/%m/%d %H:%M:%S","%d/%m/%Y %H:%M:%S"]:
        try:
            date = datetime.strptime(x,form)
        except ValueError:
            pass
    return date

sorted(data,key = lambda x: date_parse(x[6]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2018-04-13
    • 2021-10-01
    相关资源
    最近更新 更多