Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法访问包含列表的嵌套Python字典_Python_Python 3.x_Dictionary_Nested - Fatal编程技术网

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

无法访问包含列表的嵌套Python字典,python,python-3.x,dictionary,nested,Python,Python 3.x,Dictionary,Nested,我有下面的嵌套字典: facter_networking: {"domain": "mylab.com", "fqdn": "mylab.com", "hostname": "mylab", "interfaces": {"ens192": {"bindings": [{"address": &qu

我有下面的嵌套字典:

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

您知道如何访问上述值吗?

问题是您试图访问一个类似于dict的列表:

...{"bindings": [{"address": "20.9.8.1...
访问您需要的地址

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

问题在于,您试图访问一个类似于dict的列表:

...{"bindings": [{"address": "20.9.8.1...
访问您需要的地址

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

快速修复: 您的问题在于对上一个嵌套字典“address”的访问。因为它在成为字典之前嵌套在列表中,所以您应该这样得到它:

myfile['facter\u networking']['interfaces']['ens192']['bindings'][在此处插入所需索引]['address']
更好的修复方法
然而,您目前有一个巨大的设计问题。在dicts中的列表中嵌套dicts在dicts中的列表是一个嵌套地狱,它使调试任何正在发生的事情变得更加困难,从而阻止您高效地编码。幸运的是,python是一种面向对象的语言!您可以用专用对象替换大部分词典,从而更好地管理代码,并减少将来出现类似此错误的可能性。

快速修复: 您的问题在于对上一个嵌套字典“address”的访问。因为它在成为字典之前嵌套在列表中,所以您应该这样得到它:

myfile['facter\u networking']['interfaces']['ens192']['bindings'][在此处插入所需索引]['address']
更好的修复方法
然而,您目前有一个巨大的设计问题。在dicts中的列表中嵌套dicts在dicts中的列表是一个嵌套地狱,它使调试任何正在发生的事情变得更加困难,从而阻止您高效地编码。幸运的是,python是一种面向对象的语言!您可以用专用对象替换大多数词典,从而更好地管理代码,并减少将来出现类似此错误的可能性。

如注释部分所述,
{“bindings”:[{“address”
是一个列表。和往常一样,如果您试图使用索引访问一个空列表,它将抛出异常。相反,它将遍历该列表,以便在列表为空时得到空列表

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

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

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

20.9.8.1
输出:

20.9.8.1

{“bindings”:[{“address”:..
有一个列表作为值,而不是另一个字典。所以你需要
myfile['facter\u networking']['interfaces']['ens192']['bindings'][0]['address']
,假设只有一项。我以前尝试过,但没有成功。
get\u network=myfile['facter\u networking']['interfaces'['ens192'['bindings'][0]['address']KeyError:'ens192'
{“bindings”:[{“address”:..有一个列表作为值,而不是另一个字典。所以你需要
myfile['facter\u networking']['interfaces']['ens192']['bindings'][0]['address']
,假设只有一项。我以前尝试过,但没有成功。
get\u network=myfile['facter\u networking']['ens192']['bindings'][0]['address']KeyError:'ens192'
我以前尝试过,这是输出。由于某些原因无法工作,我是否做错了什么?
myip=myfile['facter\u networking']['interfaces']['ens192']['bindings'][0]['address']KeyError:“ens192”
我以前尝试过,这是输出。由于某种原因,我没有工作,是不是做错了什么?
myip=myfile['facter\u networking']['interfaces']['ens192']['bindings'][0]['address']KeyError:'ens192'
我以前试过,这是输出。出于某种原因不起作用,我做错了什么吗?
myip=myfile['facter\u networking']['interfaces']['ens192']['bindings'][0]['address']KeyError:'ens192'
我以前试过,这是输出。出于某种原因,我做错了什么吗['facter_networking']['interfaces']['ens192']['bindings'][0]['address']KeyError:'ens192'我不理解你的循环。
I['address']I在我的文件['facter_networking']['interfaces']['ens192']['bindings']
我试图在这里复制,但没有成功。
语法错误:无效语法
无效语法缺少一些东西,我不理解
I[“address”]
这称为列表理解。这与循环的正常操作相同。在代码中缺少
[
在一开始。所以它抛出了错误。我不理解你的循环。
I[“地址”]for I in myfile['facter\u networking']['interfaces']['ens192']['bindings']]
我试图在这里复制,但没有成功。
语法错误:无效语法
无效语法缺少一些东西,我不理解
I[“地址”]
这称为列表理解。这与循环的正常情况相同。在代码中,您缺少
[
一开始,它抛出了错误。我设法找到了我的问题。所以,当我在阅读一堆文件时,我希望它们都有相同的密钥,但对于这个特定的密钥,情况似乎不是这样。所以,一些文件有ens192,其他文件有bond0,其他文件有ens198,我现在才注意到。有没有什么方法可以这样写:'*“
print(d['facter\u networking']['interface'][*]['bindings'][0]['address']]
,因为这里每个文件唯一不同的地方是键ens192、键0和键ens198。作为一种解决方法,我尝试了:除了以下内容:
try:get\u network\u inter=myfile['facter\u networking']['inter接口]['bond0'['bindings'][0]['address']打印(文件+'-->bond0:'+get_network_inter)除了:get_network_inter=myfile['facter_networking']['interfaces']['ens192']['