首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问其中包含列表的嵌套Python字典

无法访问其中包含列表的嵌套Python字典
EN

Stack Overflow用户
提问于 2020-07-26 00:07:15
回答 4查看 75关注 0票数 0

我有下面嵌套的字典:

代码语言:javascript
复制
facter_networking: {"domain": "mylab.com", "fqdn": "mylab.com", "hostname": "mylab", "interfaces": {"ens192": {"bindings": [{"address": "20.9.8.1", "netmask": "255.255.255.221", "network": "20.33.50.62"}], "ip": "20.67.83.48", "mac": "00:00:06:0:e0:d6", "mtu": 1500, "netmask": "255.255.255.224", "network": "20.67.83.48"}, "ens224": {"bindings": [{"address": "20.67.83.48", "netmask": "20.67.83.48", "network": "20.67.83.48"}], "ip": "20.67.83.48", "mac": "20.67.83.48", "mtu": 1500, "netmask": "255.255.255.224", "network": "20.67.83.48"}, "lo": {"bindings": [{"address": "127.0.0.1", "netmask": "255.0.0.0", "network": "127.0.0.0"}], "ip": "127.0.0.1", "mtu": 65536, "netmask": "255.0.0.0", "network": "127.0.0.0"}}, "ip": "20.67.83.48", "mac": "00:00:00:9d:8f:d7", "mtu": 1500, "netmask": "255.255.255.224", "network": "20.67.83.48", "primary": "ens224"}

我可以读取大多数键值,但其中一些我不能。

例如:

代码语言:javascript
复制
print(myfile['facter_networking']['domain']) - it works.
print(myfile['facter_networking']['fqdn']) - it works.
print(myfile['facter_networking']['hostname'])    - it works.

然而,如果我这样做了。

代码语言:javascript
复制
print(myfile['facter_networking']['interfaces']['ens192']['bindings']['address']) - It doens't work.

另一方面,如果我这样做了:

代码语言:javascript
复制
print(myfile['facter_networking']['interfaces']

我得到了结果:

代码语言:javascript
复制
{"ens192": {"bindings": [{"address": "20.9.8.1", "netmask": "255.255.255.221", "network": "20.33.50.62"}], "ip": "20.67.83.48", "mac": "00:00:06:0:e0:d6", "mtu": 1500, "netmask": "255.255.255.224", "network": "20.67.83.48"}, "ens224": {"bindings": [{"address": "20.67.83.48", "netmask": "20.67.83.48", "network": "20.67.83.48"}], "ip": "20.67.83.48", "mac": "20.67.83.48", "mtu": 1500, "netmask": "255.255.255.224", "network": "20.67.83.48"}, "lo": {"bindings": [{"address": "127.0.0.1", "netmask": "255.0.0.0", "network": "127.0.0.0"}], "ip": "127.0.0.1", "mtu": 65536, "netmask": "255.0.0.0", "network": "127.0.0.0"}}, "ip": "20.67.83.48", "mac": "00:00:00:9d:8f:d7", "mtu": 1500, "netmask": "255.255.255.224", "network": "20.67.83.48", "primary": "ens224"}

你知道如何访问上面的这些值吗?

EN

回答 4

Stack Overflow用户

发布于 2020-07-26 00:15:42

快速修复:您的问题出在访问最后一个嵌套字典"address“。因为它在成为字典之前是嵌套在列表中的,所以你应该像这样得到它:

代码语言:javascript
复制
myfile['facter_networking']['interfaces']['ens192']['bindings'][insert desired index here]['address']

更好的修复了:然而,你目前有一个巨大的设计问题。在dicts中嵌套dicts在dicts中的列表中嵌套dicts是一个嵌套地狱,它使调试正在发生的任何事情变得更加困难,从而阻止了您有效地编码。幸运的是,python是一种面向对象的语言!您可以将大多数字典替换为专用对象,有效地更好地管理您的代码,并减少将来发生类似错误的可能性。

票数 1
EN

Stack Overflow用户

发布于 2020-07-26 00:15:52

正如评论部分所说,{"bindings": [{"address"是一个列表。而且,和往常一样,如果您尝试使用索引访问空列表,它将抛出异常。相反,循环遍历它,以便在列表为空的情况下得到空列表作为结果

代码语言:javascript
复制
In [66]: [i["address"] for i in myfile['facter_networking']['interfaces']['ens192']['bindings']]
Out[66]: ['20.9.8.1']
票数 1
EN

Stack Overflow用户

发布于 2020-07-26 00:13:42

问题是,您试图像访问字典一样访问列表:

代码语言:javascript
复制
...{"bindings": [{"address": "20.9.8.1...

访问您需要的地址

代码语言:javascript
复制
....["bindings"][0]["address"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63090525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档