在Python中将JSON或字典数据格式化为部分扁平结构

1 投票
1 回答
53 浏览
提问于 2025-04-14 15:44
sample_data = {
  "instances": [
    {
      "a": "1987",
      "b": "2001",
      "art": {
        "009": {
          "art_id": "009",
          "mm": {
            "1002": {
              "mm_code": "1002",
              "node": {
                "6625583": {
                  "node_id": "6625583",
                  "node_sc": "186",
                  "node_si": [
                    {
                      "measure": "S",
                      "chest": 29
                    },
                    {
                      "measure": "M",
                      "chest": 32
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  ]
}

我们需要什么? 我有一些样本数据,我需要把 sample["instances"][0] 转换成以下格式。

sample_data = {
  "instances": [
    {
      "a": "1987",
      "b": "2001",
      "art_id": "009",
      "mm_code": "1002",
      "node_id": "6625583",
      "node_sc": "186",
      "measure": "S",
      "chest": 29
    },
    { 
      "a": "1987",
      "b": "2001",
      "art_id": "009",
      "mm_code": "1002",
      "node_id": "6625583",
      "node_sc": "186",
      "measure": "M",
      "chest": 32
    }
  ]
}

需求

  1. 需要一个耗时非常少的解决方案。
  2. 可能会有多个“art_id”或者“art”和“mm”的嵌套值。这意味着:
{ "instances":
  [
    { "a": "1987", "b": "2001",
      "art":
         {
         001:{--},
         002:{--}
          }
    },
   { "a": "197", "b": "201",
      "art":
         {
         001:{--},
         002:{--}
          }
    },
 ]
}

这同样适用于 mmnodes

我尝试过这个解决方案: imran的解决方案,但没能达到所需的格式。 谢谢大家的帮助!

1 个回答

0

这里有一个可能的解决方案,教你如何把这个字典变得简单扁平:

sample_data = {
    "instances": [
        {
            "a": "1987",
            "b": "2001",
            "art": {
                "009": {
                    "art_id": "009",
                    "mm": {
                        "1002": {
                            "mm_code": "1002",
                            "node": {
                                "6625583": {
                                    "node_id": "6625583",
                                    "node_sc": "186",
                                    "node_si": [
                                        {"measure": "S", "chest": 29},
                                        {"measure": "M", "chest": 32},
                                    ],
                                }
                            },
                        }
                    },
                }
            },
        }
    ]
}


def find_node_si(dct):
    if "node_si" not in dct:
        next_dct = next(v for v in dct.values() if isinstance(v, dict))
        return find_node_si(next_dct)
    else:
        return dct["node_si"]


def return_all_key_values(dct):
    keys = [(k, v) for k, v in dct.items() if not isinstance(v, (list, dict))]
    next_dct = next((v for v in dct.values() if isinstance(v, dict)), None)
    if next_dct:
        return keys + return_all_key_values(next_dct)
    else:
        return keys


out = {"instances": []}
for i in sample_data["instances"]:
    dct = return_all_key_values(i)
    for node_si in find_node_si(i):
        out["instances"].append(dict(dct + list(node_si.items())))

print(out)

输出结果是:

{
    "instances": [
        {
            "a": "1987",
            "b": "2001",
            "art_id": "009",
            "mm_code": "1002",
            "node_id": "6625583",
            "node_sc": "186",
            "measure": "S",
            "chest": 29,
        },
        {
            "a": "1987",
            "b": "2001",
            "art_id": "009",
            "mm_code": "1002",
            "node_id": "6625583",
            "node_sc": "186",
            "measure": "M",
            "chest": 32,
        },
    ]
}

撰写回答