1. 問題梳理
由于業(yè)務(wù)的需要,需要對列表類型的進(jìn)行多列排序,問題梳理:
- list 里存儲的是復(fù)雜對象
- 需要支持多列排序、升序降序
2. 問題轉(zhuǎn)換
從sql的角度理解,就是要按字段進(jìn)行排序。
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 造數(shù)據(jù)
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 進(jìn)行排序
說明:specs 的字段排序順序與sql是反著來的
specs = [('orderTime', False), ('price', True)]
new_orders = mulit_sort(orders, specs)