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

Python列表匹配同ref字典对计算配送时长写入目标字典问题排查

问题原因

你代码触发KeyError是因为存在以下几个核心错误:

  1. 缩进逻辑完全错误:服务商判断、写入data字典的代码全部缩进在else: r=3的分支下,只有路线3的订单会被写入字典,路线1、2的订单根本不会执行赋值操作,访问自然报错。
  2. 布尔运算写法错误:i['location'] == 'A' or 'B'的逻辑是永远为真(非空字符串'B'在布尔判断中默认为True),所有匹配到的订单都会被判定为路线1,后续匹配逻辑完全失效。
  3. 配对逻辑不可靠:双层循环+自增a的配对方式,无法保证同一ref的pickup和delivery记录正确匹配,也可能出现重复匹配、时间差计算为负的问题。
  4. 时间差计算逻辑缺漏:没有判断哪个是pickup时间哪个是delivery时间,直接用后遍历的时间减先遍历的,可能出现负数。

修正方案

推荐先按ref分组处理,逻辑更清晰不容易出错,修正后代码如下:
首先补全基础定义(修正了原待处理列表的语法错误,补全倒数第二个字典的右括号):

# 预先定义的目标字典
data = {1: {"Queen": {}, "Star": {}, "Trim":{}},
        2: {"Queen": {}, "Star": {}, "Trim":{}},
        3: {"Queen": {}, "Star": {}, "Trim":{}}}

# 待处理的原始列表
order_list = [
    {'provider': 'Queen', 'ref': 0, 'location': 'B', 'time': 911, 'type': 'pickup'},
    {'provider': 'Star', 'ref': 1, 'location': 'B', 'time': 912, 'type': 'pickup'},
    {'provider': 'Queen', 'ref': 0, 'location': 'A', 'time': 913, 'type': 'delivery'},
    {'provider': 'Trim', 'ref': 3, 'location': 'B', 'time': 914, 'type': 'pickup'},
    {'provider': 'Trim', 'ref': 4, 'location': 'C', 'time': 915, 'type': 'pickup'},
    {'provider': 'Trim', 'ref': 3, 'location': 'C', 'time': 916, 'type': 'delivery'},
    {'provider': 'Trim', 'ref': 4, 'location': 'A', 'time': 917, 'type': 'delivery'},
    {'provider': 'Star', 'ref': 1, 'location': 'A', 'time': 918, 'type': 'delivery'}
]

处理逻辑代码:

# 按ref分组存储订单记录
ref_groups = {}
for order in order_list:
    ref = order['ref']
    if ref not in ref_groups:
        ref_groups[ref] = []
    ref_groups[ref].append(order)

# 逐个处理每个ref的订单对
for ref, orders in ref_groups.items():
    # 拆分pickup和delivery记录
    pickup = [o for o in orders if o['type'] == 'pickup'][0]
    delivery = [o for o in orders if o['type'] == 'delivery'][0]
    # 计算配送时长
    delivery_time = delivery['time'] - pickup['time']
    # 地点排序后判定路线,避免先后顺序影响判断结果
    locs = sorted([pickup['location'], delivery['location']])
    if locs == ['A', 'B']:
        route = 1
    elif locs == ['A', 'C']:
        route = 2
    elif locs == ['B', 'C']:
        route = 3
    # 写入目标字典
    provider = pickup['provider']
    data[route][provider][ref] = delivery_time

# 测试输出
print(data[1]["Star"][1]) # 输出6
print(data[2]['Trim'][4]) # 输出2

运行上述代码即可得到你预期的data字典结构,不会再触发KeyError。

内容的提问来源于stack exchange,提问作者Hayley Tan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:00:00