按键排序Python列表

4

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

我知道有一个接受key函数的list.sort()函数。在这种情况下,我是否需要使用日期和时间创建datetime,并将其用作sort()的关键字?可以使用datetime.datetime.combine(date,time)来实现此目的。但是,我如何在sort函数内指定它呢?

我尝试了key = datetime.datetime.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方法来执行这里所需的计算。 - user2665694
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_datecreated_time 不是可用的本地变量。 lambda 提供了延迟评估:它创建一个函数,而不是立即执行代码,当调用该函数时,它将执行指定的代码并返回结果。该函数还提供了用于访问created_datecreated_time属性的参数。

2

使用lambda

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

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 参数(在这里不是必需的,但对于可以短路的足够昂贵的键函数,这可能更快)。


0

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

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

然后按日期对事物进行排序,仅当日期匹配时才考虑时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接