晚上好人!我已经在这个问题上挣扎了好几个小时,现在可以用正确的方向做一点指针。我正在玩一些API调用并尝试为自己制作一个小项目。
JSON数据存储在Arrays中,因此为了获取我想要的信息(来自传输API),我一直在制作以下内容
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'])
这将返回以下内容
06:58:00
23:39
06:37
05:08:00
05:14
10:22
03:41:00
05:30
09:11
03:47:00
06:24
10:11
我想要做的是,只返回最短的旅程 - 如果它是单层JSON字符串我可以做到但我不太喜欢多级数组。我不能在不使用['路线']和路线指示符(在这种情况下为0到3或4)的情况下返回['持续时间']。
我可以使用if语句轻松地遍历它们,但必须有一种方法可以通过我缺少的JSON直接完成它。我还想过将结果添加到一个单独的数组中,然后对其进行过滤 - 但是当我破解这个部分时,我还想从数据中获取一些其他字段。
我发现,我学到的是,我倾向于以漫长的方式做事,经常发现我在代码战中的10-15行解决方案实际上是针对2-3行完成的。
示例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"
}]
}]
}
希望你能指导我朝着正确的方向前进!
答案 0 :(得分:1)
这是使用datetime.timedelta
的一个解决方案。来自@fferri的数据。
from datetime import timedelta
x = {'routes': [{'duration':'06:58:00','departure_time':'23:39','arrival_time':'06:37'},
{'duration':'05:08:00','departure_time':'05:14','arrival_time':'10:22'},
{'duration':'03:41:00','departure_time':'05:30','arrival_time':'09:11'},
{'duration':'03:47:00','departure_time':'06:24','arrival_time':'10:11'}]}
def minimum_time(k):
h, m, s = map(int, x['routes'][k]['duration'].split(':'))
return timedelta(hours=h, minutes=m, seconds=s)
res = min(range(4), key=minimum_time) # 2
然后,您可以通过x['routes'][res]
访问相应的子词典。
答案 1 :(得分:0)
使用带有min()
参数的key
来指示应该使用哪个字段来查找最小值:
x={'routes':[
{'duration':'06:58:00','departure_time':'23:39','arrival_time':'06:37'},
{'duration':'05:08:00','departure_time':'05:14','arrival_time':'10:22'},
{'duration':'03:41:00','departure_time':'05:30','arrival_time':'09:11'},
{'duration':'03:47:00','departure_time':'06:24','arrival_time':'10:11'}
]}
best=min(x['routes'], key=lambda d: d['duration'])
# best={'duration': '03:41:00', 'departure_time': '05:30', 'arrival_time': '09:11'}
答案 2 :(得分:0)
你正在寻找min(iterable,key = ...)函数:
x = { 'routes': [ {'dur':3, 'depart':1, 'arrive':4},
{'dur':2, 'depart':2, 'arrive':4}]}
min(x['routes'], key=lambda item: item['dur'])
返回:
{'dur': 2, 'depart': 2, 'arrive': 4}
答案 3 :(得分:0)
首先,x
从JSON初始化的事实并不特别相关。这是一个dict
,这一切都很重要。
要回答您的问题,您只需要key
属性min
:
shortest = min(x['routes'], key=lambda d: d['duration'])