基于键排序python列表

时间:2013-01-07 14:56:50

标签: python sorting key

我在python列表中有一些Entrys。每个Entry都有一个创建日期和创建时间。这些值存储为python datetime.date和datetime.time(作为两个单独的字段)。我需要获取Entrys列表已排序的sothat先前创建的Entry在其他人之前。

我知道有一个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))

4 个答案:

答案 0 :(得分: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属性的参数。

答案 1 :(得分:2)

使用lambda

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

答案 2 :(得分: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参数(这里不需要它,但是对于可以短路的足够昂贵的键功能,这可能会更快)

答案 3 :(得分:0)

使用这样的元组可能会稍快一点:

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

然后事情将按日期排序,并且只有日期匹配才会考虑时间。