2013-01-07 205 views
4

我在Python列表中有一些Entrys。每個條目都有一個創建日期和創建時間。這些值存儲爲python datetime.date和datetime.time(作爲兩個單獨的字段)。我需要獲取先前創建的Entrys排序的Sothat的列表先於其他。基於關鍵字排序python列表

我知道有一個list.sort()函數接受一個關鍵函數。在這種情況下,我是否必須使用日期和時間來創建日期時間並將其作爲sort()的關鍵字?這裏有一個datetime.datetime.combine(date,time)。但是如何在sort函數中指定這個呢?

我試圖key = datetime.datetim.combine(created_date,created_time)

但解釋抱怨the name created_date is not defined

class Entry: 
    created_date = #datetime.date 
    created_time = #datetime.time 
    ... 

my_entries_list=[Entry1,Entry2...Entry10] 
my_entries_list.sort(key = datetime.datetim.combine(created_date,created_time)) 
+1

這是行不通的。您需要定義您自己的方法或lambda方法來執行此處需要的計算。 –

回答

7

你可能想是這樣的:

my_entries_list.sort(key=lambda v: 
          datetime.datetime.combine(v.created_date, v.created_time)) 

傳遞datetime.datetime.combine(created_date, created_time)立即嘗試呼叫combine並自created_datecreated_time不能作爲局部變量中斷。 lambda提供了延遲評估:不是立即執行代碼,而是創建一個函數,它將在調用時執行指定的代碼並返回結果。該函數還提供將用於訪問created_datecreated_time屬性的參數。

2

使用lambda

sorted(my_entries_list, 
     key=lambda e: datetime.combine(e.created_date, e.created_time)) 
1

documentation

key指定用於提取從每個列表元素

例如比較關鍵一個參數的函數。

def combined_date_key(elem): 
    return datetime.datetime.combine(v.created_date, v.created_time) 

entries.sort(key=combined_date_key) 

(這與已發佈的lambda相同,只是爲了清楚起見而分開)。

你的另一種選擇是使用cmp參數(它在這裏不需要,但它可以是短路的十分昂貴,關鍵功能,這可能會更快)

0

可能稍快使用這樣的元組:

sorted(my_entries_list, 
     key = lambda e: (e.created_date, e.created_time)) 

然後事情將按日期排序,只有當日期匹配時纔會考慮時間。