【问题标题】:Sort datetime and return index error in Python在 Python 中对日期时间进行排序并返回索引错误
【发布时间】:2018-01-13 04:04:51
【问题描述】:

我想对 'datetime' 对象列表进行排序并返回索引, 例如排序[(2012, 6, 1, 0, 0),(2010, 1, 1, 0, 0)] 并返回[2,1]

我使用了以下python代码:

>>>date_seq = [datetime.datetime(1993, 3, 25, 0, 0),
   datetime.datetime(1985, 6, 18, 0, 0),
   datetime.datetime(1971, 7, 8, 0, 0)]

>>>sorted(date_seq, key=lambda k:date_seq[k])

但收到错误消息:

TypeError: list indices must be integers or slices, not datetime.datetime

我的问题是

  1. 为什么代码 'sorted(date_seq)' 工作正常,但 'sorted(date_seq, key=lambda k :date_seq[k])'?

  2. 在这种情况下如何获取排序后的索引?

【问题讨论】:

    标签: python-3.x sorting datetime


    【解决方案1】:

    在这种情况下,您不能使用 key。它基本上是在这里对嵌套列表或基于其属性之一的对象、基于其值的字典等进行排序。

    key=lambda k:date_seq[k]
    

    k 是一个datetime 对象,因为sorted 迭代date_seq 并在其中的每个项目上执行你的lambda,所以他知道排序顺序(你的lambda 的输出必须是“可比的”,例如, 你可以使用>, <, == 等等就可以了,这意味着__lt__.__eq__ 被定义了,当然它们之间的输出必须是可比的,否则会引发异常)

    例如

    sorted(date_seq, key=lambda x: x.month)
    

    将按月份升序对您的日期进行排序(当然忽略年份和日期):

    [datetime.datetime(1993, 3, 25, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1971, 7, 8, 0, 0)]
    

    编辑我没有看到的第二个问题:

    sorted 不是map(或列表理解)。它不能更改列表中的项目,它只会对它们进行排序。 您想使用map 或列表解析,以及list.index 函数。

    [sorted(date_seq).index(x) + 1 for x in date_seq]
    # outputs [3, 2, 1] for your sample array
    

    Here is documentation for sorted (python 3.6).

    【讨论】:

    • 我明白我为什么错了。关于返回索引而不是排序列表的任何想法?
    • 我的编辑似乎完全符合您的要求。它获取排序列表,然后获取未排序列表中每个项目在此排序列表中的索引。
    【解决方案2】:

    您尝试对列表进行排序,因此您必须使用integer 作为列表索引。您使用了 kdatetime.datetime 类型。所以你得到这个错误:

    >>> import datetime
    >>> date_seq = [datetime.datetime(1993, 3, 25, 0, 0),
    ...    datetime.datetime(1985, 6, 18, 0, 0),
    ...    datetime.datetime(1971, 7, 8, 0, 0)]
    >>> sorted(date_seq, key=lambda k:date_seq[0])
    [datetime.datetime(1993, 3, 25, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1971, 7, 8, 0, 0)]
    >>> sorted(date_seq, key=lambda k:k.year) # sort according to `year`
    [datetime.datetime(1971, 7, 8, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1993, 3, 25, 0, 0)]
    >>> sorted(date_seq, key=lambda k:k.month) # sort according to `month`
    [datetime.datetime(1993, 3, 25, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1971, 7, 8, 0, 0)]
    >>> sorted(date_seq, key=lambda k:k.day) # # sort according to `day`
    [datetime.datetime(1971, 7, 8, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1993, 3, 25, 0, 0)]
    >>>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 2019-07-28
      • 2021-07-22
      • 1970-01-01
      • 2022-01-08
      • 2019-05-04
      • 1970-01-01
      • 2020-01-02
      相关资源
      最近更新 更多