我有两个列表,每个列表都由date
的对象组成。我试图将它们组合起来然后按日期排序:
combined = invoices + payments
combined.sort(key = lambda x: x.date)
一切都很好。但是,如果同一天有invoice
个对象和payment
对象,我希望将payment
放在invoice
之前的列表中。
答案 0 :(得分:6)
请改为:
combined = payments + invoices
python iterable.sort
方法保证稳定。 (See python docs on standar types, 5.6.4 note 9)
这意味着如果您的列表中有a
和b
两个元素key(a) == key(b)
,那么他们将保持相对顺序(即{{1} }}被放置在未排序列表的a
之前,在它排序之后仍然是这样的。
答案 1 :(得分:2)
你应该可以做这样的事情来获得你想要的分类:
index.html
这个想法是,只要对象是不同的,您就可以创建一个排序元组,其中包含对象来自哪个列表的指示符。如果日期匹配,那么它将按日期排序,然后转到第二个字段。
答案 2 :(得分:0)
除了cmp=
之外,您还可以在sort
函数中使用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)
。
Row_Number