📜  Python – 扁平化嵌套键(1)

📅  最后修改于: 2023-12-03 15:04:12.569000             🧑  作者: Mango

Python - 扁平化嵌套键

在Python中,访问嵌套字典或者嵌套列表变量的方式是通过使用多个[ ]号来访问每个嵌套层次。我们可以使用递归函数来访问多层嵌套字典的数据,但这种方法不够直观和高效。一个更好的方法是将多层嵌套的键扁平化,这样我们就可以使用一个单独的键访问任何嵌套层次的变量。

实现

我们可以使用一个递归函数来实现扁平化嵌套键。这个函数接受一个字典作为参数,其中包含多层嵌套的键值对。函数遍历所有键值对,如果遇到嵌套的字典,就递归地调用函数来处理嵌套的字典。对于每个扁平化的键值对,我们将键名添加到一个列表中,并将与该键名对应的值附加到另一个列表中。最后,我们将这两个列表打包成一个元组列表并返回。

这里是实现代码的示例:

def flatten_dict(dict_obj, parent_key='', sep='_'):
    items = []
    for k, v in dict_obj.items():
        new_key = parent_key + sep + k if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_dict(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)
示例

我们可以使用下面的字典作为示例数据:

data = {
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main St.",
        "city": "Anytown",
        "state": "CA",
        "zipcode": "12345"
    },
    "phones": [
        {
            "type": "home",
            "number": "555-1234"
        },
        {
            "type": "work",
            "number": "555-5678"
        }
    ]
}

现在,我们可以调用flatten_dict函数来扁平化嵌套的键:

result = flatten_dict(data)
print(result)

输出结果将是:

{
    "name": "John",
    "age": 30,
    "address_street": "123 Main St.",
    "address_city": "Anytown",
    "address_state": "CA",
    "address_zipcode": "12345",
    "phones_0_type": "home",
    "phones_0_number": "555-1234",
    "phones_1_type": "work",
    "phones_1_number": "555-5678"
}
结论

扁平化嵌套键是一个非常有用的技巧,它可以为我们节省大量的时间和精力,使代码更容易理解和维护。使用递归函数可以轻松地实现扁平化嵌套键,并且可以适用于任何深度嵌套的字典或者列表。这是一个很实用的技巧,值得我们掌握。