2017-08-05 47 views
0

我想排序'datetime'对象列表并返回索引 分类[(2012, 6, 1, 0, 0),(2010, 1, 1, 0, 0)]并返回[2,1]Python中的排序日期时间和返回索引错误

我用下面的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. 为什么代码“排序(DATE_SEQ )'work罚款,但不是'排序(date_seq,key = lambda k:date_seq [k])'?

  2. 如何在这种情况下获得排序的指数?

回答

0

在这种情况下,你不能使用key。它基本上是在此基础上他们的价值观等

key=lambda k:date_seq[k] 

k嵌套列表,或根据自己的属性的一个对象,类型的字典进行排序是一个datetime对象,因为sorted遍历date_seq,并在它的每个项目执行你的拉姆达,所以他知道的排列顺序(您拉姆达的输出必须是“可比”,例如,你可以使用它><==等,这意味着__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).

+0

我明白为什么我错了。任何想法返回索引,而不是排序列表? –

+0

我的编辑似乎完全是你想做的事情。它采用排序后的列表,然后获取未排序列表中每个项目的此排序列表中的索引。 – Unatiel

0

您尝试对列表进行排序,因此必须使用integer作为列表索引。您使用的是使用的k,即datetime.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)] 
>>>