【问题标题】:Python Concatenate Dictionary keysPython连接字典键
【发布时间】:2021-08-25 12:18:50
【问题描述】:

我有一本这样的字典:

[
  {
    "context": {
      "id": "aaa",
      "number": "123456",
      "codes": {
        "code": {
          "code": "abc123456",
          "codeDesc": "sample",
          "codeInfo": "example"
        }
      }
    },
    "info": {
      "action": "CREATE",
      "code": null,
      "status": "SUCCESS",
      "description": "abc123456"
    },
    "spec": {
      "code": "abc123456",
      "id": "aaa",
      "url": "https://myexampleabc.mydomain.com",
      "enable": true
    }
  },
  {
    "context": {
      "id": "bbb",
      "number": "789123",
      "codes": {
        "code": {
          "code": "def789123",
          "codeDesc": "sample",
          "codeInfo": "example"
        }
      }
    },
    "info": {
      "action": "CREATE",
      "code": null,
      "status": "SUCCESS",
      "description": "def789123"
    },
    "spec": {
      "code": "def789123",
      "id": "bbb",
      "url": "https://myexampledef.mydomain.com",
      "enable": true
    }
  },
  {
    "context": {
      "id": "ccc",
      "number": "456789",
      "codes": {
        "code": {
          "code": "ghi456789",
          "codeDesc": "sample",
          "codeInfo": "example"
        }
      }
    },
    "info": {
      "action": "CREATE",
      "code": null,
      "status": "SUCCESS",
      "description": "ghi456789"
    },
    "spec": {
      "code": "ghi456789",
      "id": "ccc",
      "url": "https://myexampleghi.mydomain.com",
      "enable": true
    }
  }
]

我想这样翻译: “key1.key2.key3”:“价值”

[
  {
    "context.id": "aaa",
    "context.number": "123456",
    "context.codes.code.code": "abc123456",
    "context.codes.code.codeDesc": "sample",
    "context.codes.code.codeInfo": "example",
    "info.action": "CREATE",
    "info.code": null,
    "info.status": "SUCCESS",
    "info.description": "abc123456",
    "spec.code": "abc123456",
    "spec.id": "aaa",
    "spec.url": "https://myexampleabc.mydomain.com",
    "spec.enable": true
  },
  {
    "context.id": "bbb",
    "context.number": "789123",
    "context.codes.code.code": "def789123",
    "context.codes.code.codeDesc": "sample",
    "context.codes.code.codeInfo": "example",
    "info.action": "CREATE",
    "info.code": null,
    "info.status": "SUCCESS",
    "info.description": "def789123",
    "spec.code": "def789123",
    "spec.id": "bbb",
    "spec.url": "https://myexampledef.mydomain.com",
    "spec.enable": true
  },
  {
    "context.id": "ccc",
    "context.number": "456789",
    "context.codes.code.code": "ghi456789",
    "context.codes.code.codeDesc": "sample",
    "context.codes.code.codeInfo": "example",
    "info.action": "CREATE",
    "info.code": null,
    "info.status": "SUCCESS",
    "info.description": "ghi456789",
    "spec.code": "ghi456789",
    "spec.id": "ccc",
    "spec.url": "https://myexampleghi.mydomain.com",
    "spec.enable": true
  }
]

我尝试用一​​些循环和 isinstance() 函数来做,但我不能做我想做的事。 我无法处理代码的子级别。

我尝试这样的事情

jsondata = json.loads(dataJson)

for level0 in jsondata:
    if isinstance(level0, dict):
      level1Keys = level0.keys()
      level1Values = level0.values()
      print(level1Keys)
      print(level1Values)

我也尝试过.pop() 方法,但我认为我的方法不对...

【问题讨论】:

  • nulltrue 不是 Python 值。请纠正这一点,以便帮助者可以复制和粘贴。
  • 这应该可以帮助你stackoverflow.com/questions/6027558/…
  • 我认为您需要更清楚地了解您的目标最终数据框形式。如果你能做到这一点,那就太好了。

标签: python json dictionary


【解决方案1】:

以下递归函数将嵌套的 dict 转换为虚线路径键:

def flatten(obj):
    if isinstance(obj, dict):
        res = {}
        for k, v in obj.items():
            f = flatten(v)
            if isinstance(f, dict):
                for k_, v_ in f.items():
                    res[f"{k}.{k_}"] = v_
            else:
                res[k] = f
        return res
    return obj

flattened = list(map(flatten, jsondata))

【讨论】:

    【解决方案2】:

    你可以试试这样的

    l = json.loads("""[
      {
        "context": {
          "id": "aaa",
          "number": "123456",
          "codes": {
            "code": {
              "code": "abc123456",
              "codeDesc": "sample",
              "codeInfo": "example"
            }
          }
        },
        "info": {
          "action": "CREATE",
          "code": null,
          "status": "SUCCESS",
          "description": "abc123456"
        },
        "spec": {
          "code": "abc123456",
          "id": "aaa",
          "url": "https://myexampleabc.mydomain.com",
          "enable": true
        }
      },
      {
        "context": {
          "id": "bbb",
          "number": "789123",
          "codes": {
            "code": {
              "code": "def789123",
              "codeDesc": "sample",
              "codeInfo": "example"
            }
          }
        },
        "info": {
          "action": "CREATE",
          "code": null,
          "status": "SUCCESS",
          "description": "def789123"
        },
        "spec": {
          "code": "def789123",
          "id": "bbb",
          "url": "https://myexampledef.mydomain.com",
          "enable": true
        }
      },
      {
        "context": {
          "id": "ccc",
          "number": "456789",
          "codes": {
            "code": {
              "code": "ghi456789",
              "codeDesc": "sample",
              "codeInfo": "example"
            }
          }
        },
        "info": {
          "action": "CREATE",
          "code": null,
          "status": "SUCCESS",
          "description": "ghi456789"
        },
        "spec": {
          "code": "ghi456789",
          "id": "ccc",
          "url": "https://myexampleghi.mydomain.com",
          "enable": true
        }
      }
    ]""")
    
    def flatten_dict(d, current_key, final_dict):
        for k,v in d.items():
            if isinstance(v, dict):
                current_key.append(k)
                flatten_dict(v, current_key, final_dict)
                current_key.pop()
            else:
                current_key.append(k)
                final_dict['.'.join(current_key)] = v
                current_key.pop()
        return final_dict
    
    result = [flatten_dict(i, [], {}) for i in l]
    
    [{'context.id': 'aaa',
      'context.number': '123456',
      'context.codes.code.code': 'abc123456',
      'context.codes.code.codeDesc': 'sample',
      'context.codes.code.codeInfo': 'example',
      'info.action': 'CREATE',
      'info.code': None,
      'info.status': 'SUCCESS',
      'info.description': 'abc123456',
      'spec.code': 'abc123456',
      'spec.id': 'aaa',
      'spec.url': 'https://myexampleabc.mydomain.com',
      'spec.enable': True},
     {'context.id': 'bbb',
      'context.number': '789123',
      'context.codes.code.code': 'def789123',
      'context.codes.code.codeDesc': 'sample',
      'context.codes.code.codeInfo': 'example',
      'info.action': 'CREATE',
      'info.code': None,
      'info.status': 'SUCCESS',
      'info.description': 'def789123',
      'spec.code': 'def789123',
      'spec.id': 'bbb',
      'spec.url': 'https://myexampledef.mydomain.com',
      'spec.enable': True},
     {'context.id': 'ccc',
      'context.number': '456789',
      'context.codes.code.code': 'ghi456789',
      'context.codes.code.codeDesc': 'sample',
      'context.codes.code.codeInfo': 'example',
      'info.action': 'CREATE',
      'info.code': None,
      'info.status': 'SUCCESS',
      'info.description': 'ghi456789',
      'spec.code': 'ghi456789',
      'spec.id': 'ccc',
      'spec.url': 'https://myexampleghi.mydomain.com',
      'spec.enable': True}]
    

    【讨论】:

    • @LeRoyLoïc 实际上我的代码中存在关于浅拷贝的重大缺陷,请确保您检查了新代码。这是非常重要的。我真的很抱歉在发布之前没有测试我的代码。
    【解决方案3】:

    你可以试试递归:

    lst = [
      {
        "context": {
          "id": "aaa",
          "number": "123456",
          "codes": {
            "code": {
              "code": "abc123456",
              "codeDesc": "sample",
              "codeInfo": "example"
            }
          }
        },
        "info": {
          "action": "CREATE",
          "code": None,
          "status": "SUCCESS",
          "description": "abc123456"
        },
        "spec": {
          "code": "abc123456",
          "id": "aaa",
          "url": "https://myexampleabc.mydomain.com",
          "enable": True
        }
      },
      {
        "context": {
          "id": "bbb",
          "number": "789123",
          "codes": {
            "code": {
              "code": "def789123",
              "codeDesc": "sample",
              "codeInfo": "example"
            }
          }
        },
        "info": {
          "action": "CREATE",
          "code": None,
          "status": "SUCCESS",
          "description": "def789123"
        },
        "spec": {
          "code": "def789123",
          "id": "bbb",
          "url": "https://myexampledef.mydomain.com",
          "enable": True
        }
      },
      {
        "context": {
          "id": "ccc",
          "number": "456789",
          "codes": {
            "code": {
              "code": "ghi456789",
              "codeDesc": "sample",
              "codeInfo": "example"
            }
          }
        },
        "info": {
          "action": "CREATE",
          "code": None,
          "status": "SUCCESS",
          "description": "ghi456789"
        },
        "spec": {
          "code": "ghi456789",
          "id": "ccc",
          "url": "https://myexampleghi.mydomain.com",
          "enable": True
        }
      }
    ]
    
    def join_keys(d, res={}):
        for k, v in d.items():
            if isinstance(v, dict):
                for key, val in v.copy().items():
                    del v[key]
                    v[f"{k}.{key}"] = val
                    if isinstance(val, str):
                        res[f"{k}.{key}"] = val
                join_keys(v, res)
        return res
    
    for d in lst:
        print(join_keys(d))
    

    输出:

    {"context.id": "aaa",
     "context.number": "123456",
     "context.codes.code.code": "abc123456",
     "context.codes.code.codeDesc": "sample",
     "context.codes.code.codeInfo": "example",
     "info.action": "CREATE",
     "info.code": None,
     "info.status": "SUCCESS",
     "info.description": "abc123456",
     "spec.code": "abc123456",
     "spec.id": "aaa",
     "spec.url": "https://myexampleabc.mydomain.com",
     "spec.enable": True}
    {"context.id": "bbb",
     "context.number": "789123",
     "context.codes.code.code": "def789123",
     "context.codes.code.codeDesc": "sample",
     "context.codes.code.codeInfo": "example",
     "info.action": "CREATE",
     "info.code": None,
     "info.status": "SUCCESS",
     "info.description": "def789123",
     "spec.code": "def789123",
     "spec.id": "bbb",
     "spec.url": "https://myexampledef.mydomain.com",
     "spec.enable": True}
    {"context.id": "ccc",
     "context.number": "456789",
     "context.codes.code.code": "ghi456789",
     "context.codes.code.codeDesc": "sample",
     "context.codes.code.codeInfo": "example",
     "info.action": "CREATE",
     "info.code": None,
     "info.status": "SUCCESS",
     "info.description": "ghi456789",
     "spec.code": "ghi456789",
     "spec.id": "ccc",
     "spec.url": "https://myexampleghi.mydomain.com",
     "spec.enable": True}
    

    【讨论】:

      【解决方案4】:

      你可以试试这个获取信息的简单方法,希望对你有所帮助。

      level=[]
      data={} 
      for fields in some_dict :
        data["context.id"] =  fields.get("context").get("id")
        data["context.number"] =  fields.get("context").get("number")
        data["context.codes"] =  fields.get("context").get("codes").get("code")
        data["context.codes.codeDesc"] = fields.get("context").get("codes").get("codeDesc")
        data["context.codes.codeInfo"] =  fields.get("context").get("codes").get("codeInfo")
        data["info.action"] = fields.get("info").get("action")
        level.append(data)
        print(level)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-12
        相关资源
        最近更新 更多