按日期排序Python对象列表

45

我有一个名为results的Python列表。在results列表中的每个结果都有一个人对象,而每个人对象都有一个生日(result.person.birthdate)。生日是一个datetime对象。

我想按照生日从旧到新对列表进行排序。最Pythonic的方法是什么?

2个回答

81
results.sort(key=lambda r: r.person.birthdate)

1
其实我认为你不需要使用 reverse=True - rlibby
2
是的,我已经删除了它;关于“最老”,我有点脑抽了。 - Amber
刚刚注意到一些对象的人物对象设置为None。我仍然希望这些结果在列表中。我该如何做到这一点,同时还能对其他对象进行排序?谢谢。 - shane
我会将其作为一个新问题提出。 - shane
@shane:results.sort(key=lambda r: getattr(r.person, 'birthday', datetime.max)) - jfs
8
注意:list.sort 方法是原地排序,不返回已排序的列表。如果您不想修改原始列表,请使用 sorted(results, key=...) - Paulo Scardine

16

完全同意Amber的观点,但是还有另一种按属性排序的方法(从维基百科获取:https://wiki.python.org/moin/HowTo/Sorting):

from operator import attrgetter
sorted_list = sorted(results, key=attrgetter('person.birthdate'))

这种方法实际上甚至可以比使用 lambda 进行排序更快。


3
如果将'person.birdate'作为变量传递,attrgetter()很方便。否则,lambda更加灵活(例如,如果person有时候是None),而在大多数情况下时间差异应该可以忽略不计。 - jfs
@J.F. Sebastian:同意,我只是引用了维基百科的内容 :) 我将编辑答案。 - yentsun

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