You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按价格优先规则排序订单簿的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:25:29