Python列表匹配同ref字典对计算配送时长写入目标字典问题排查
问题原因
你代码触发KeyError是因为存在以下几个核心错误:
- 缩进逻辑完全错误:服务商判断、写入data字典的代码全部缩进在
else: r=3的分支下,只有路线3的订单会被写入字典,路线1、2的订单根本不会执行赋值操作,访问自然报错。 - 布尔运算写法错误:
i['location'] == 'A' or 'B'的逻辑是永远为真(非空字符串'B'在布尔判断中默认为True),所有匹配到的订单都会被判定为路线1,后续匹配逻辑完全失效。 - 配对逻辑不可靠:双层循环+自增a的配对方式,无法保证同一ref的pickup和delivery记录正确匹配,也可能出现重复匹配、时间差计算为负的问题。
- 时间差计算逻辑缺漏:没有判断哪个是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
相关产品推荐
相关产品推荐

