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)