python中的排序列表-给予优先级

python中的排序列表-给予优先级,python,list,sorting,Python,List,Sorting,我有两个列表,每个列表都由具有日期的对象组成。我正在尝试将它们合并,然后按日期订购: combined = invoices + payments combined.sort(key = lambda x: x.date) 一切都很好。但是,如果在同一天同时存在发票对象和付款对象,我希望将付款放在发票之前的列表中,只需执行以下操作: combined = payments + invoices pythoniterable.sort方法保证是稳定的。() 这意味着,如果列表中有两个元素a和b

我有两个列表,每个列表都由具有
日期的对象组成。我正在尝试将它们合并,然后按日期订购:

combined = invoices + payments
combined.sort(key = lambda x: x.date)
一切都很好。但是,如果在同一天同时存在
发票
对象和
付款
对象,我希望将
付款
放在
发票
之前的列表中,只需执行以下操作:

combined = payments + invoices
python
iterable.sort
方法保证是稳定的。()


这意味着,如果列表中有两个元素
a
b
,使得
key(a)==key(b)
,那么它们将保持相对顺序(也就是说,如果
a
放在未排序列表中
b
之前,排序后仍然是这样).

您应该能够执行以下操作以获得所需的排序:

combined.sort(key = lambda x: (x.date, 1 if x in invoices else 0))

其思想是,只要对象是不同的,就可以创建一个排序元组,其中包括对象来自哪个列表的指示符。这将使它首先按日期排序,然后如果日期匹配,则转到第二个字段。

除了
键=
,您还可以在
排序功能中使用
cmp=

class Invoice(object):
    P = 1
    def __init__(self, date):
        self.date = date

class Payment(object):
    P = 0
    def __init__(self, date):
        self.date = date


l = [Invoice(10), Payment(10), Invoice(10)]

def xcmp(x, y):
    c0 = cmp(x.date, y.date)
    return c0 if c0 != 0 else cmp(x.__class__.P, y.__class__.P)

l.sort(cmp=xcmp)

我在找一些像那张纸条一样的信息。谢谢你的推荐。我找不到它。解决方案太简单了。不敢相信我漏掉了明显的.BTW,如果你有混合数据,你可以用
组合.sort(key=lambda x:(x.date,x.is_invoice))
,假设你有is_invoice布尔属性。元组将逐项比较,因此如果第一项(日期)相同,将比较第二项(is_发票)(False将在True之前)。这是一个很好的信息,我肯定喜欢这个想法。我想我还有另一个好地方可以使用同样的逻辑。