python - 删除除具有最小日期的数组之外的所有嵌套 JSON 数组

标签 python json python-3.x

我有以下 JSON 字典。 我想做的是删除所有“close_approach_data”对象,其中“orbiting_body”不是“地球”。 问题是可能有不止一个具有 Orbiting_body:“Earth”的物体,并且在所有这些物体之间,我尝试保留具有最小“approach_date”的物体。

data = [
  {
    "id": "01",
    "close_approach_data": [
      {
        "orbiting_body": "Earth",
        "approach_date": "1945-06-07"
      },
      {
        "orbiting_body": "Earth",
        "approach_date": "1975-06-07"
      },
      {
        "orbiting_body": "Mars",
        "approach_date": "1935-06-07"
      }
    ]
  },
{
    "id": "02",
    "close_approach_data": [
      {
        "orbiting_body": "Earth",
        "approach_date": "1945-06-07"
      },
      {
        "orbiting_body": "Earth",
        "approach_date": "1975-06-07"
      },
      {
        "orbiting_body": "Mars",
        "approach_date": "1935-06-07"
      }
    ]
  }
]

我想得到这个:

data = [
  {
    "id": "01",
    "close_approach_data": {
      "orbiting_body": "Mars",
      "approach_date": "1935-06-07"
    }
  },
  {
    "id": "02",
    "close_approach_data": {
      "orbiting_body": "Mars",
      "approach_date": "1935-06-07"
    }
  }
]

所以我试图想出一些代码:

earthObjs =[]
for element in data:
    for subel in element["close_approach_data"]:
        if ([subel][0]["orbiting_body"]=="Earth"):
            #then i would have to store the objects
            earthObjs.append([subel])

    #here i am trying to find the object with the min 'approach_date'
    minEarth = min(dt.strptime(earthObjs["close_approach_date"],"%Y-%m-%d"))

    #then i would have to somehow place this as the only element of close_approach_data
    element["close_approach_data"] = json.loads(minEarth)

    #and clear the earthObjs list so it can be used for the next element
    earthObjs.clear()

我很清楚我的代码有一半不起作用。我想我可能终于接近让它发挥作用了,我只是真的需要一些帮助。具体来说,我知道在搜索 min 时我做错了什么,因为我无法访问对象的 'close_approach_data' 字段。 另外,我也不确定 json.load 行。

最佳答案

这是将您描述的处理相当直接地转换为代码:

from datetime import datetime
import json

for dataset in data:
    earliest, initial = datetime.max, {}

    # Find the non-Earth body with the earliest approach date.
    for close_approach in dataset["close_approach_data"]:
        if close_approach["orbiting_body"] != "Earth":
            dt = datetime.strptime(close_approach["approach_date"],
                                   "%Y-%m-%d")
            if dt < earliest:
                dt, initial = earliest, close_approach

    # Replace entire close_approach_data list with a single object
    # comprised of the non-Earth item with the earliest date (or an
    # empty dictionary if there weren't any).
    dataset["close_approach_data"] = initial

print(json.dumps(data, indent=4))

输出:

[
    {
        "id": "01",
        "close_approach_data": {
            "orbiting_body": "Mars",
            "approach_date": "1935-06-07"
        }
    },
    {
        "id": "02",
        "close_approach_data": {
            "orbiting_body": "Mars",
            "approach_date": "1935-06-07"
        }
    }
]

关于python - 删除除具有最小日期的数组之外的所有嵌套 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282616/

相关文章:

python - 拟合后访问套索回归系数

javascript - (初学者)如何动态修改一个json文件

python - 在 bash 上运行 Flask : Could not import "app"

python - Tkinter 菜单没有选项卡 [仅限 Windows]

json - 无法将数据集从SPARK传输到HBase表

python - 如何从 Python 3 中的字符串列表中获取时间戳和用户 ID?

python - 我将如何在 python 中制作自定义错误消息

python - Selenium Python Firefox webdriver : can't modify profile

python - 绘制雅可比椭圆函数

PHP json_decode 有单引号问题但不是双引号