为了简单起见,假设我在 Python 中有一个 Person 类。此类具有名字、姓氏和出生日期的字段。
class Person:
def __init__(self, firstname, lastname, dob):
self.firstname = firstname;
self.lastname = lastname;
self.dob = dob;
在某些情况下,我想按姓氏后跟名字后跟出生日期对人员列表进行排序。在其他情况下,我想先按出生日期排序,然后按姓氏排序,最后按名字排序。有时我只想按名字排序。
创建第一个比较函数的天真的解决方案是这样的:
def comparepeople(person1, person2):
if cmp(person1.lastname, person2.lastname) == 0:
if cmp(person1.firstname, person2.firstname) == 0:
return cmp(person1.dob, person2.dob);
return cmp(person1.firstname, person2.firstname);
return cmp(person1.lastname, person2.lastname);
似乎应该有一种简单的方法来使用元编程方法来定义像这样的比较函数,我需要做的就是按优先顺序提供字段名称,而不是编写这些非常冗长、丑陋的比较方法。但我最近才开始使用 Python,并没有发现任何与我描述的类似的东西。
所以问题是,为具有多个可比较组成成员的类编写比较函数的最 Pythonic 方法是什么?
请您参考如下方法:
如果你真的想要一个比较功能,你可以使用
def comparepeople(p1, p2):
o1 = p1.lastname, p1.firstname, p1.dob
o2 = p2.lastname, p2.firstname, p2.dob
return cmp(o1,o2)
这依赖于元组比较。如果你想对一个列表进行排序,你不应该写一个比较函数,但是,而是一个关键函数:
l.sort(key=lambda p:(p.lastname, p.firstname, p.dob))
这样做的优点是 a) 更短 b) 更快,因为每个键只计算一次(而不是在排序期间在比较函数中创建大量元组)。
