【问题标题】:How to get last element of a JSON list如何获取 JSON 列表的最后一个元素
【发布时间】:2018-08-25 08:27:01
【问题描述】:

我遇到了一个简单的问题:

我通过urllib 得到一个 JSON 应用列表,看起来像这样:

    "completedapps" : [ {
    "starttime" : 1520863179923,
    "id" : "app-20180312145939-0183",
    "name" : "IE_Traitement_3",
    "cores" : 1,
    "user" : "root",
    "memoryperslave" : 1024,
    "submitdate" : "Mon Mar 12 14:59:39 CET 2018",
    "state" : "FINISHED",
    "duration" : 212967
  }, {
    "starttime" : 1520863398147,
    "id" : "app-20180312150318-0186",
    "name" : "IE_Traitement_3",
    "cores" : 1,
    "user" : "root",
    "memoryperslave" : 1024,
    "submitdate" : "Mon Mar 12 15:03:18 CET 2018",
    "state" : "FINISHED",
    "duration" : 6321
  }, {
    "starttime" : 1520863387941,
    "id" : "app-20180312150307-0185",
    "name" : "IE_Traitement_0A",
    "cores" : 1,
    "user" : "root",
    "memoryperslave" : 1024,
    "submitdate" : "Mon Mar 12 15:03:07 CET 2018",
    "state" : "FINISHED",
    "duration" : 149536
  }, { ... }]

我想获取名为“IE_Traitement_OA”的应用程序的最新元素,所以我开始像这样过滤我的 JSON:

[app for app in parsedjson['completedapps'] if app['name'] == "IE_Traitement_OA"]

但我现在卡住了,我不知道如何获得最新的“应用程序”?我想我必须使用starttimesubmitdate 字段,但我不知道如何处理。你能帮帮我吗?

【问题讨论】:

  • JSON 数据直到被转换为字典结构。字典本质上不是一个有序的结构。如果要保留订单,则需要使用 OrderedDict 转换它们。
  • 好的,我已经更新了我的 json.load 方法来添加参数“object_pairs_hook=OrderedDict”,但是接下来呢?

标签: python json filtering


【解决方案1】:

您可以使用以下过滤器:

a = list(filter(lambda x: x['name'] == 'IE_Traitement_0A', data['completedapps']))

a 将包含与您的过滤器匹配的所有 dict 的列表,然后您可以对列表进行排序以找到最新的列表 - 使用任何键对其进行排序

sorted_a = sorted(a, key=lambda k: k['starttime'])

如果您只想要一个,则选择sorted_a 的第一个元素,假设它不为空。

编辑:使用 min 而不是 sorted 感谢提示@VPfB

min_a = min(a, key=lambda k: k['starttime'])

【讨论】:

  • 如果您只想要一个元素,请使用min,而不是对整个序列进行排序,然后丢弃除第一个元素之外的所有元素。
  • 感谢@VPfB 这确实更好用——我已经编辑了我的答案
【解决方案2】:

如果你要使用starttime,你可以像这样使用max函数:

数据 = [{ “开始时间”:1520863398147, “id”:“app-20180312150318-0186”, “名称”:“IE_Traitement_3”, “核心”:1, “用户”:“根”, “记忆奴隶”:1024, “提交日期”:“2018 年 3 月 12 日星期一 15:03:18 CET”, “状态”:“完成”, “持续时间”:6321 }, { “开始时间”:1520863387941, “id”:“app-20180312150307-0185”, “名称”:“IE_Traitement_0A”, “核心”:1, “用户”:“根”, “记忆奴隶”:1024, “提交日期”:“2018 年 3 月 12 日星期一 15:03:07 CET”, “状态”:“完成”, “持续时间”:149536 }] most_recent = max(data,key=lambda e: e['starttime']) 打印(最近)

现在,如果你想使用submitdate,你需要先转换

此链接有一些转换示例:Converting string into datetime

好看!

【讨论】:

    【解决方案3】:
    req_json = """{"completedapps" : [ {
        "starttime" : 1520863179923,
        "id" : "app-20180312145939-0183",
        "name" : "IE_Traitement_3",
        "cores" : 1,
        "user" : "root",
        "memoryperslave" : 1024,
        "submitdate" : "Mon Mar 12 14:59:39 CET 2018",
        "state" : "FINISHED",
        "duration" : 212967
      }, {
        "starttime" : 1520863398147,
        "id" : "app-20180312150318-0186",
        "name" : "IE_Traitement_3",
        "cores" : 1,
        "user" : "root",
        "memoryperslave" : 1024,
        "submitdate" : "Mon Mar 12 15:03:18 CET 2018",
        "state" : "FINISHED",
        "duration" : 6321
      }, {
        "starttime" : 1520863387941,
        "id" : "app-20180312150307-0185",
        "name" : "IE_Traitement_0A",
        "cores" : 1,
        "user" : "root",
        "memoryperslave" : 1024,
        "submitdate" : "Mon Mar 12 15:03:07 CET 2018",
        "state" : "FINISHED",
        "duration" : 149536
      } ]}"""
    
    import json
    data = json.loads(req_json)
    
    print(sorted(data['completedapps'], key=lambda x: x['starttime'])[0]['id'])
    
    out:
    
    app-20180312145939-0183
    

    说明:先获取dict列表,然后按时间戳排序。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2022-11-15
      • 1970-01-01
      • 2021-08-10
      • 2013-06-19
      • 2018-12-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多