Python如何访问字典内重复键对应列表的order_book特定数据
报错根因
你触发的TypeError: list indices must be integers or slices, not str,本质是索引逻辑写错:要么是没先提取接口返回里的result挂单列表,直接对整个响应字典遍历后误用字符串键索引列表;要么是写列表推导式时顺序颠倒,直接对列表对象用['side']这类字符串键取值——列表仅支持整数、切片做索引,自然会抛错。
首先做数据预处理,把挂单列表从响应里拆出来,这步是所有后续操作的基础:
# 接口返回结构参考 api_response = { "ret_code": 0, "ret_msg": "ok", "result": [ {"symbol": "ETHUSDT", "price": 3210.45, "size": 0.92, "side": "buy"}, {"symbol": "ETHUSDT", "price": 3210.32, "size": 1.76, "side": "buy"}, {"symbol": "ETHUSDT", "price": 3210.21, "size": 2.34, "side": "buy"}, {"symbol": "ETHUSDT", "price": 3210.68, "size": 0.57, "side": "sell"}, {"symbol": "ETHUSDT", "price": 3210.79, "size": 3.12, "side": "sell"}, {"symbol": "ETHUSDT", "price": 3210.85, "size": 1.08, "side": "sell"}, ] } # 提前取出挂单列表,避免后续重复写索引 order_book_list = api_response["result"]
三类查询需求实现代码
1. 提取买/卖侧前5档挂单size
订单簿默认规则:买盘(bid)按价格从高到低排档,卖盘(ask)按价格从低到高排档,如果接口返回的result没做排序,自己先排序再切片:
# 买侧前5档size buy_side = [o for o in order_book_list if o["side"] == "buy"] buy_top5_size = [o["size"] for o in sorted(buy_side, key=lambda x:x["price"], reverse=True)[:5]] # 卖侧前5档size sell_side = [o for o in order_book_list if o["side"] == "sell"] sell_top5_size = [o["size"] for o in sorted(sell_side, key=lambda x:x["price"])[:5]]
如果接口文档明确说明返回的result已经按盘口档位排好序,直接跳过sorted步骤切片即可。
2. 指定价格查询对应挂单size
注意:浮点数直接用==比较容易因为精度误差漏匹配,一定要加精度容错判断
def query_size_by_price(target_price: float, order_list: list, precision: float = 1e-6) -> float | None: for order in order_list: if abs(order["price"] - target_price) < precision: return order["size"] # 无匹配挂单返回None return None # 调用示例 eth_3210_size = query_size_by_price(3210.79, order_book_list)
如果需要统计同价位所有挂单的总size,把匹配到的size累加返回即可。
3. 查询指定侧size最大的挂单
直接用内置max函数,按size字段做排序键即可,记得做空值判断避免抛错:
def query_largest_order(side: str, order_list: list) -> dict | None: target_side_orders = [o for o in order_list if o["side"] == side] if not target_side_orders: return None return max(target_side_orders, key=lambda x:x["size"]) # 调用示例:查卖侧最大挂单 largest_sell_order = query_largest_order("sell", order_book_list)
学习方向指引
- 先打牢Python基础数据结构操作:重点练字典/列表的索引规则、遍历逻辑、列表推导式的执行顺序,能解决90%这类语法报错
- 掌握Python内置序列处理函数:
sorted()、max()/min()、filter()的key参数用法,处理这类结构化列表数据效率远高于手写循环 - 补交易场景基础常识:订单簿的盘口排序规则、档位定义、浮点数精度问题,避免出现语法对了但业务逻辑错的问题
内容的提问来源于stack exchange,提问作者Jack Mahon
相关产品推荐
相关产品推荐

