python拾遗系列:python下list类型的排序

1. 问题梳理

由于业务的需要,需要对列表类型的进行多列排序,问题梳理:

  • list 里存储的是复杂对象
  • 需要支持多列排序、升序降序

2. 问题转换

从sql的角度理解,就是要按字段进行排序。

select * from orders order by price desc, orderTime asc;

3. 问题解决

3.1 声明order类

class Order(object):
  id:int
  price: float
  volume: float
  orderTime: float

3.2 造数据

from datetime import datetime
from time import sleep
def gen_order(id, price, volume):
    order = Order()
    order.volume = volume
    order.id = id
    order.price = price
    order.orderTime = datetime.today().timestamp()
    return order

order1 = gen_order(1, 10., 100.)
sleep(0.5)
order2 = gen_order(2, 10, 50.)
order3 = gen_order(3, 11., 100.)
orders = [order1, order2, order3]

3.3 编写排序代码

from operator import attrgetter
def mulit_sort(objs, specs):
    for key, reverse in specs:
      objs.sort(key=attrgetter(key), reverse=reverse)
    return objs

3.4 进行排序

说明:specs 的字段排序顺序与sql是反着来的

specs = [('orderTime', False), ('price', True)]
new_orders = mulit_sort(orders, specs)

你可能感兴趣的:(python拾遗系列:python下list类型的排序)