【问题标题】:Remove entire JSON object if it contains a specified phrase (from a list in python)如果它包含指定的短语,则删除整个 JSON 对象(来自 python 中的列表)
【发布时间】:2020-03-11 15:05:25
【问题描述】:

具有类似于以下内容的 JSON 文件输出:

{
   "object1": {
      "json_data": "{json data information}",
      "tables_data": "TABLES_DATA"
   },
   "object2": {
      "json_data": {json data information}",
      "tables_data": ""
   }
}

基本上,如果tables_data 有一个空字符串,如object2 所示(例如"tables_data": ""),我希望删除整个对象,以便输出如下所示:

{
   "object1": {
      "json_data": "{json data information}",
      "tables_data": "TABLES_DATA"
   }
}

执行此操作的最佳方法是什么?这些对象中的每一个都对应于一个名为summary[] 的列表中的单独索引。

【问题讨论】:

  • 在什么情况下应该移除对象?从json文件本身,还是从json文件读取后的内存中python字典?
  • 来自 json 文件本身

标签: python json list object


【解决方案1】:

要实现这一点,您可以遍历 JSON 字典并测试 tables_data 值,如果 objectX 元素通过测试,则将其添加到新字典中:

new_dict = {k: v for k, v in json_dict.items()
            if v.get("tables_data", "") != ""}

如果您的 JSON objectX 如您所说存储在列表中,则可以使用列表推导按如下方式处理:

filtered_summary = [object_dict for object_dict in summary
                    if object_dict.get("tables_data", "") != ""]

【讨论】:

  • 这会在 python 3 中引发 RuntimeError(字典在迭代期间更改了大小)
  • 是的,你是对的。我已经更新了我的答案,改为仅使用过滤后的元素创建一个新字典。
  • 我的 json 信息都存储在一个列表中,所以我没有 'items' 属性
  • @weovibewvoibweoivwoiv 如果不是 JSON 或字典,请在问题中显示您的数据结构示例。
  • 我帖子的最后一行表明我有一个名为 summary[] 的列表,其中包含我的 JSON 信息。本质上,每个对象对应于summary 列表中的不同项
【解决方案2】:

除非您有令人信服的理由不这样做,否则过滤掉列表或 dict(或任何可迭代)的 Python 方法不是就地更改它,而是创建一个新的过滤器。对于您的情况,这看起来像

raw_data = YOUR_DICT_HERE_WHEREVER_IT_COMES_FROM
# NB : empty string have a false value in a boolean test
cleaned_data = {k:v for k, v in raw_data.items() if not v["table_data"]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多