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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:31:04