提问人:Veeresh Shenoy 提问时间:8/3/2023 最后编辑:UpAndAdamVeeresh Shenoy 更新时间:8/3/2023 访问量:28
如何将嵌套数据添加到字典中?
How to add nested data into a Dictionary?
问:
我的情况是,我正在尝试从 json 请求构建一个字典,并且在尝试将数据插入嵌套级别时得到了一个。KeyError
我已经这样做了,它给了我现有的数据,我试图将其添加到空字典中,但是在分配给空字典时,由于值是嵌套的,因此会出现错误。requests.get(url)
例:
我有一本字典
temp = {}
我无法将值分配给
temp["conf"]["data"]["network"] = GET call data
它的投掷错误说.keyError
我做错了什么?
答:
当您在字典上使用时,您将获得该键的值。[key]
我认为您想返回一个字典,但目前未定义,因此您会收到一个键错误,因为它不存在。在 Python 中使用 dict 的一个好方法是 get,因为它会在键不存在时返回(而不是 KeyError)。这使您可以正常处理错误。temp["conf"]
temp["conf"]
None
我认为这将解决您的问题(您的数据结构和您想要的结构尚不清楚,因此您需要进行一些更改,但这会让您有一个开始的想法),
temp = {}
temp["conf"] = {}
temp["conf"]["data"] = {}
temp["conf"]["data"]["network"] = <value>
KeyError 是由于键不存在而出现的,因此第 2 行和第 3 行只是为该键定义一个空字典。
也许有用的提示:如果您想在 python 中将 json 转换为字典,请使用 json.dumps。
评论
另一个替代 @rkochar 提到的选项是使用 a 而不是 Dictionary,其中指定前两个层也是 ',这样您就不必显式创建嵌套层。这有缺点,因为它会强制将一定程度的同质性强加到您可能不想要的最终字典中。还有许多其他问题解释了如何使用嵌套的 DefaultDictionaries,所以我不打算在这里重新发布它们。DefaultDictionary
DefaultDictionary
问题的症结在于,在你开始的空字典中,你不能只写到几个深的嵌套级别。在尝试的赋值中,“conf”的第一个键查找将失败,因为字典为空。您必须在该键中编码,该键应具有字典的值。同样,对于“data”键到键“conf”的字典值。temp["conf"]["data"]["network"] = <value>
顺便说一句,使用数据会更好地为您服务,这将自动为您创建一个字典,您可以编辑然后使用。json.dumps
request
构建任意深度 defaultdict
结构的一个技巧:
from collections import defaultdict
tree = lambda: defaultdict(tree)
temp = tree()
temp["conf"]["data"]["network"] = "foo"
这样可以节省锅板和难以辨认:
temp.setdefault("conf", {}).setdefault("data", {})["network"] = "foo"
评论