首页 > 解决方案 > Python 3 字典查找所有元素及其关键路径

问题描述

给定一个像下面这样的字典,我想做的是找到所有元素(键+数据)及其完整的根键路径。如果数据是字符串,则返回数据和完整的密钥根。如果数据是一个字典,那么它返回该字典内的第一个键作为数据和完整的键根。

a = {
  "level1_key": {
    "level2_key": {
      "level3_key": {
        "status": "down"
      }
    }
  }
}

例如,第一个键没有根,它的数据是一个字典,所以将当前键作为数据返回,没有父键。

Key = None
Data = level1_key

level2_key 的数据是一个字典,所以返回当前键和它的父母。

Key = level1_key
Data = level2_key
Key = level1_key.level2_key
Data = level3_key
Key = level1_key.level2_key.level3_key
Data = status

最后一个键数据是一个字符串,所以将字符串作为数据返回,它的所有键

Key = level1_key.level2_key.level3_key.status
Data = down

因为字典中有 5 个元素(4 个键和 1 个字符串),所以我最终会得到 5 个键路径和数据的元组。

这背后的原因是每个元素都代表配置,如果说“状态”需要更改为“向下”,实际需要更改的是:level1_key.level2_key.level3_key.status

我写的一个非工作示例,它获取所有字符串、它们的键和部分根路径,但它并没有完全获取所有根键

current_key = ""
key_list = []

def thing(data):
    global current_key
    global key_list
    if isinstance(data, dict):
        for key, value in data.items():
            current_key = key
            key_list.append(key)
            thing(value)
    elif isinstance(data, str):

        print(f"Key: {current_key}")
        print(f"Key List: {key_list}")
        print(f"Data: {data}")
        print("##########")
        key_list = []
Data is:
{
  "100": {
    "status": "down"
  },
  "200": {
    "status1": "up",
    "status2": "down",
    "status3": {
      "nested": "more_data"
    }
  }
}
Key: status
Key List: [100, 'status']
Data: down
##########
Key: status1
Key List: [200, 'status1']
Data: up
##########
Key: status2
Key List: ['status2']
Data: down
##########
Key: nested
Key List: ['status3', 'nested']
Data: more_data
##########

例如,最后一位“more_data”缺少根键 200。

标签: pythondictionarycomparediff

解决方案


推荐阅读