2017-08-05 59 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)] 
>>>