返回JSON数组中的最小值

时间:2018-05-29 18:35:46

标签: python json

晚上好人!我已经在这个问题上挣扎了好几个小时,现在可以用正确的方向做一点指针。我正在玩一些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"
        }]
    }]
}

希望你能指导我朝着正确的方向前进!

4 个答案:

答案 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'])