当我们需要访问或者修改嵌套在字典中的值时,如果不使用参数化的方法的话,代码会变得冗长和难以维护。下面,我们将会详细介绍如何使用参数化方法来获取嵌套字典的值。
基本使用方法
假设我们有如下所示的字典:
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,返回的默认值。
通过使用参数化方法,我们可以更加灵活地获取嵌套字典中的值。这种方法尤其适用于需要定位特定位置的字典,以及需要处理大量数据的情况。