【问题标题】:Not able to access nested Python dictionary with list inside of it无法访问其中包含列表的嵌套 Python 字典
【发布时间】:2020-07-25 16:07:14
【问题描述】:

我有下面的嵌套字典:

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"}

我可以读取大部分 Keys 值,但其中一些我不能。

例如:

print(myfile['facter_networking']['domain']) - it works.
print(myfile['facter_networking']['fqdn']) - it works.
print(myfile['facter_networking']['hostname'])    - it works.

如果我这样做了。

print(myfile['facter_networking']['interfaces']['ens192']['bindings']['address']) - It doens't work.

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

print(myfile['facter_networking']['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"}

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

【问题讨论】:

  • {"bindings": [{"address":.. 有一个列表作为值,而不是另一个字典。所以你需要myfile['facter_networking']['interfaces']['ens192']['bindings'][0]['address'],假设只有一项。
  • 我之前尝试过,但没有成功。 get_network = myfile['facter_networking']['interfaces']['ens192']['bindings'][0]['address'] KeyError: 'ens192'

标签: python python-3.x dictionary nested


【解决方案1】:

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

In [66]: [i["address"] for i in myfile['facter_networking']['interfaces']['ens192']['bindings']]
Out[66]: ['20.9.8.1']

【讨论】:

  • 我不明白你的循环。 i["address"] for i in myfile['facter_networking']['interfaces']['ens192']['bindings']]我试图在这里重现但没有成功。 SyntaxError: invalid syntax Invalid Syntax 缺少某些东西,我不明白 i["address"]
  • 这称为列表理解。它与正常的 for 循环相同。在您的代码中,您在一开始就缺少[。所以它会抛出错误。
【解决方案2】:

快速修复: 您的问题在于您对最后一个嵌套字典“地址”的访问。由于它在成为字典之前嵌套在列表中,因此您应该这样获取它:

myfile['facter_networking']['interfaces']['ens192']['bindings'][insert desired index here]['address']

更好的修复: 但是,您目前有一个巨大的设计问题。在 dicts in dicts in dicts in list 中嵌套 dicts 是一个嵌套地狱,它通过使调试发生的任何事情变得更加困难,从而阻止您有效地编码。幸运的是,python 是一种面向对象的语言!您可以将大部分字典替换为专用对象,从而更好地有效管理您的代码,并降低未来发生此类错误的可能性。

【讨论】:

  • 我之前试过,这是输出。由于某种原因不起作用,我做错了什么吗? myip = myfile['facter_networking']['interfaces']['ens192']['bindings'][0]['address'] KeyError: 'ens192'
【解决方案3】:

问题是您尝试访问像字典这样的列表:

...{"bindings": [{"address": "20.9.8.1...

访问您需要的地址

....["bindings"][0]["address"]

【讨论】:

  • 我之前试过,这是输出。由于某种原因不起作用,我做错了什么吗? myip = myfile['facter_networking']['interfaces']['ens192']['bindings'][0]['address'] KeyError: 'ens192'
【解决方案4】:
d = {
    '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"
    }
}

print(d['facter_networking']['interfaces']['ens192']['bindings'][0]['address'])

输出:

20.9.8.1

【讨论】:

  • 我设法找到了我的问题。因此,当我正在阅读一堆文件时,我希望它们都具有相同的密钥,但对于这个特定的密钥似乎并非如此。所以,有些文件有 ens192,有些文件有bond0,有些文件有 ens198,我现在才注意到。有什么办法可以输入类似:'*' print(d['facter_networking']['interfaces'][*]['bindings'][0]['address'] 因为这里唯一与每个文件不同的是键 ens192、bond0 和 ens198。
  • 作为一种解决方法,我确实尝试过:除了以下内容:try: get_network_inter = myfile['facter_networking']['interfaces']['bond0']['bindings'][0]['address'] print(files + '---> bond0: ' + get_network_inter) except: get_network_inter = myfile['facter_networking']['interfaces']['ens192']['bindings'][0]['address'] print(files + '---> ens192: ' + get_network_inter)
  • 哦,我每次都发现这个特定键有更多不同的名称。有什么建议吗?
  • 好的,我设法使用了一些 IF 条件(7 个不同)。谢谢,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多