Python遍历字典列表时处理空events列表避免索引越界
解决提取字典列表中
events字段时的索引越界问题 问题背景
你需要处理一个字典列表,提取每个字典内events键对应的列表数据:
- 当
events列表非空时,取最后一个元素的message值 - 当
events列表为空时,返回空列表
现有代码直接用[-1]获取最后一个元素,空列表时会触发IndexError: list index out of range错误。
示例输入
data = [ {"id": 1, "events": [{"message": "登录成功"}, {"message": "修改密码"}]}, {"id": 2, "events": []}, {"id": 3, "events": [{"message": "提交订单"}]} ]
报错的现有代码
result = [] for item in data: event = item["events"][-1]["message"] result.append({"id": item["id"], "event": event})
报错信息
IndexError: list index out of range
预期输出
[ {"id": 1, "event": "修改密码"}, {"id": 2, "event": []}, {"id": 3, "event": "提交订单"} ]
解决方案
提供三种简洁可靠的实现方式,避免索引越界:
方式1:直观条件判断
先检查events列表是否为空,再执行对应逻辑:
result = [] for item in data: events = item["events"] event_msg = events[-1]["message"] if events else [] result.append({"id": item["id"], "event": event_msg})
方式2:列表推导式(简洁写法)
用一行推导式完成逻辑,适合代码追求精简的场景:
result = [ { "id": item["id"], "event": item["events"][-1]["message"] if item["events"] else [] } for item in data ]
方式3:兼容events键不存在的场景
如果字典可能缺少events键,用item.get("events", [])设置默认空列表,再通过反向遍历取最后一个元素:
result = [ { "id": item["id"], "event": next((e["message"] for e in reversed(item.get("events", []))), []) } for item in data ]
验证结果
运行以上任意代码,输出都会和预期一致,且不会触发索引错误。
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

