python使用参数对嵌套字典进行取值的方法

  • Post category:Python

当我们需要访问或者修改嵌套在字典中的值时,如果不使用参数化的方法的话,代码会变得冗长和难以维护。下面,我们将会详细介绍如何使用参数化方法来获取嵌套字典的值。

基本使用方法

假设我们有如下所示的字典:

example = {
    'a': {
        'b': {
            'c': 1
        }
    }
}

如果我们要获取c的值,通常的方法是通过多次使用嵌套的[]括号来获取:

value = example['a']['b']['c']

这种方法可能还可以接受,但是在庞大的字典中定位特定的位置将变得非常繁琐和错误的。而通过参数化方法,我们可以灵活地获取特定位置的值。

参数化访问嵌套字典的基本格式如下:

value = d.get('a', {}).get('b', {}).get('c', default_value)

其中d是待访问的字典,get()函数可以获取词典中的key对应的value,就像从表中查找key对应的value一样。如果没有找到对应的key,返回默认值。

示例1:字典压缩

我们先来看如何通过使用参数化方法来压缩一个字典。假设我们有如下所示的字典,它包含了一个很深的嵌套结构:

d = {
    "a": {
        "b": {
            "c": {
                "d": 1
            }
        }
    }
}

我们希望将其压缩为一个深度仅为1的字典。那么我们可以通过如下所示的代码来实现:

compressed = {'.'.join([str(k) for k in [key1, key2, key3]]): value for key1, val1 in d.items() for key2, val2 in val1.items() for key3, value in val2.items()}

这里使用了字典推导式来将原来的字典压缩为一个深度为1的字典。我们遍历原始字典中的所有项,将它们合并到一个新的字典中。

现在,我们可以通过参数化访问方法来查找'd'的值:

print(compressed.get('a.b.c.d', 'default'))

这里的结果将会是1。如果我们试图查找一个不在compressed字典中的值,比如'x.y.z',那么将会返回默认值'default'

示例2:通过JSON API解析HTTP响应

现在,我们来看一个更加实际的示例:如何使用参数化方法来解析JSON API的HTTP响应。

import requests
import json

response = requests.get('https://api.github.com/users/hfpython')
data = response.json()

print(data.get('avatar_url', 'Default value'))

在这个例子中,我们使用了Requests库来获取https://api.github.com/users/hfpython服务器的HTTP响应。然后,我们调用了response.json()方法来将响应数据解析为一个Python词典。最后,我们通过参数化访问方法来获取avatar_url的值。

如果没有找到avatar_url的值,那么将返回默认值'Default value'。注意,参数化访问方法中的最后一个参数表示如果没有找到对应的key,返回的默认值。

通过使用参数化方法,我们可以更加灵活地获取嵌套字典中的值。这种方法尤其适用于需要定位特定位置的字典,以及需要处理大量数据的情况。