如何在多层JSON数组中筛选出最短行程(Python实现)
从多层JSON中筛选最短行程的简洁实现
问题背景
我正在开发一个调用Transport API的个人项目,目前用这段Python代码遍历JSON数组里的行程数据:
x = apirequest x = x.json for i in range(0,4): print(x['routes'][i]['duration']) print(x['routes'][i]['departure_time']) print(x['routes'][i]['arrival_time'])
这段代码能返回4条行程的时长、出发和到达时间,但我不想用冗长的遍历判断,想直接从多层JSON里筛选出最短行程。我熟悉单层JSON处理,但多层数组操作不太熟,后续还要提取其他字段,求简洁实现方法。
附示例JSON数据:
{ "request_time": "2018-05-29T19:03:04+01:00", "source": "Traveline southeast journey planning API", "acknowledgements": "Traveline southeast", "routes": [{ "duration": "06:58:00", "route_parts": [{ "mode": "foot", "from_point_name": "Corunna Court, Wrexham", "to_point_name": "Wrexham General Rail Station", "destination": "", "line_name": "", "duration": "00:36:00", "departure_time": "23:39", "arrival_time": "00:15" }] }] }
解决方案
核心思路是利用Python内置的min()函数,配合自定义的时长转换逻辑,不用手动遍历就能快速筛选出最短行程。
1. 先把时长字符串转为可比较的数值
因为duration是HH:MM:SS格式的字符串,没法直接比较大小,所以先写个小函数把它转换成总秒数:
def duration_to_seconds(duration_str): hours, minutes, seconds = map(int, duration_str.split(':')) return hours * 3600 + minutes * 60 + seconds
2. 一键筛选最短行程
直接对routes数组使用min(),通过key参数指定用转换后的秒数作为比较依据,就能直接拿到最短的那条行程对象:
# 注意:requests响应解析需要调用json()方法,你原来的x.json要改成x.json() x = apirequest.json() # 筛选最短行程 shortest_route = min(x['routes'], key=lambda route: duration_to_seconds(route['duration'])) # 提取你需要的字段,后续加其他字段直接用shortest_route['字段名']即可 print("最短行程时长:", shortest_route['duration']) print("出发时间:", shortest_route['departure_time']) print("到达时间:", shortest_route['arrival_time']) # 比如提取子行程的步行信息 print("第一段行程方式:", shortest_route['route_parts'][0]['mode'])
3. 边界情况处理
如果API可能返回空的routes数组,记得加个判断避免报错:
if routes := x.get('routes'): shortest_route = min(routes, key=lambda route: duration_to_seconds(route['duration'])) else: print("未查询到可用行程")
内容的提问来源于stack exchange,提问作者user9866087
相关产品推荐
相关产品推荐

