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
pythoniterable.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之前)。这是一个很好的信息,我肯定喜欢这个想法。我想我还有另一个好地方可以使用同样的逻辑。