今天一个 bug 困扰了我很长时间,
我对一个列表排序,根据某个字段,但是当2个 item 字段的值是相同的时候,不会保证排序
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': True, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
('b', {'is_default': False, 'page_list': , 'order': 0L})
这里前面按照 order 和 pagelist 的 create_on 排序,而 order一样的时候 会按照 create on 排序,注意两组数最后的两个,他们的 order 是一样的,create on 也是一样的,那么在这种情况下 本质上 排序结果是确定的。
但是你用的是 python 的 list sort func 即 lists.sort(key=lambda p: (-p['order'], p['page_list'].created_on), reverse=True)
,boge这里告诉我说,这个函数就是按照这两个字段排序,保证这两个字段排序是准确的,但是当字段相同的时候,排序是不确定的,像今天的这个问题,多了一项 item,就导致最后面的排序不一样了。
我花了大量时间在纠结为啥多了一个 item 排序就不一样了,以为是哪里的问题,实际是排序的问题,这个事情对我很重要,真正的问题在哪里,真正的问题在哪里。
要明确,排序函数干的事情,是保证排序字段的不同的前提下的准确性,而排序字段相同的时候,什么也不会保证,除非你再增加排序字段,排序只是按照相应的字段进行排序