4

我在 python 列表中有一些条目。每个条目都有一个创建日期和创建时间。这些值存储为 python datetime.date 和 datetime.time(作为两个单独的字段)。我需要获取排序的条目列表,以便之前created 条目位于其他条目之前。

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

4 回答 4

8

你可能想要这样的东西:

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_date并且created_time不能用作局部变量。lambda提供延迟评估:它不是立即执行代码,而是创建一个函数,该函数将在调用时执行指定的代码并返回结果。该函数还提供了用于访问created_datecreated_time属性的参数。

于 2013-01-07T14:58:56.207 回答
2

使用lambda

sorted(my_entries_list,
       key=lambda e: datetime.combine(e.created_date, e.created_time))
于 2013-01-07T14:58:52.397 回答
1

文档

key 指定一个参数的函数,用于从每个列表元素中提取比较键

例如。

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

entries.sort(key=combined_date_key)

(这与已经发布的 lambda 相同,只是为了清晰起见)。

您的另一个选择是使用cmp参数(这里不需要,但是对于可以短路的足够昂贵的键功能,这可能会更快)

于 2013-01-07T15:02:27.323 回答
0

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

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

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

于 2013-01-07T15:26:15.657 回答