如何按价格优先规则排序订单簿的DefaultDict(先值后键)
订单簿排序解决方案
问题分析
你当前的字典结构是单价格对应单个订单,但目标是每个价格下维护按提交时间排序的订单列表,再整体按价格优先级(买盘价格越高优先级越高)排序。之前的代码仅对所有订单按提交时间排序,未做价格分组与价格优先级排序,因此无法达成需求。
分步实现代码
1. 按价格分组并排序同价格下的订单
如果你的原始订单是分散的单条数据(避免字典重复键问题),先按价格分组,再对每组内的订单按提交时间升序排序(时间数值越小,提交越早):
from collections import defaultdict # 示例原始订单数据(格式:(价格, 数量, 提交时间, 是否做市商)) raw_bids = [(100, 5, 2, True), (100, 4, 1, False), (101, 2, 3, True), (101, 4, 1, False)] # 按价格分组 grouped_bids = defaultdict(list) for price, size, submit_time, is_market_maker in raw_bids: grouped_bids[price].append((size, submit_time, is_market_maker)) # 对每个价格下的订单按提交时间升序排序 for price in grouped_bids: grouped_bids[price].sort(key=lambda order: order[1])
2. 按价格降序排序整个订单簿
买盘遵循价格越高优先级越高的规则,因此对价格键做降序排序,生成最终订单簿(Python 3.7+版本字典会保留插入顺序):
# 按价格从高到低排序,转换为标准字典 sorted_bids = dict(sorted(grouped_bids.items(), key=lambda item: -item[0]))
执行后得到的结果完全符合你的需求:
{ 101: [(4, 1, False), (2, 3, True)], 100: [(4, 1, False), (5, 2, True)] }
原代码无效原因
你之前的sorted(bids.items(), key=lambda item: item[1][1])仅将所有订单(忽略价格)按提交时间排序,既没有按价格分组,也未体现价格优先的核心规则,因此无法得到目标结构。
额外说明
- 若你的原始
bids已是defaultdict(list)类型(每个价格对应订单列表),可直接跳过分组步骤,先对每组内的订单排序,再按价格排序即可。 - 若处理卖盘(asks),只需将价格排序规则改为升序(
key=lambda item: item[0])。
内容的提问来源于stack exchange,提问作者Boulisto
相关产品推荐
相关产品推荐

