使用.values()的JSON最后一个键级别的值错误

2024-10-01 04:47:12 发布

您现在位置:Python中文网/ 问答频道 /正文

"fwt-master2": {
        "ipv4": {
                "rtr": {
                        "ip": "1.2.3.4",
                        "net": "3.4.5.6",
                        "netlen": "24",
                        "netmask": "255.255.255.0",
                        "broadcast": "7.8.9.1"
                }
        }

我试图从这个JSON文件中获取ip,而不指定每个元素的值(不使用fwt-maser2[ipv4][rtr][ip])。 使用.values()方法(.values()[0].values()[0].values()[0]`)

我得到的是netlen值(24),而不是ip值,后者实际上是第一个元素

为什么会发生这样的事


Tags: 文件方法ipjson元素netnetmaskbroadcast
3条回答

如果您只知道目标键是"ip",那么可以使用递归:

s = {"fwt-master2": {
    "ipv4": {
            "rtr": {
                    "ip": "1.2.3.4",
                    "net": "3.4.5.6",
                    "netlen": "24",
                    "netmask": "255.255.255.0",
                    "broadcast": "7.8.9.1"
            }
    }
  }
}

def get_ip(d):
   return [i for c in filter(None, [b if a == 'ip' else get_ip(b) if isinstance(b, dict) else None for a, b in d.items()]) for i in c]

print(''.join(get_ip(s)))

输出:

1.2.3.4

我认为使用嵌套代码来查找键值是最好的方法…这样您只需搜索dict中的“broadcast”键,然后打印它的值 在这里试试:find all occurances of a key

我决定翻阅一下你的字典,发现它不完整

你的字典:

 "fwt-master2": {
            "ipv4": {
                    "rtr": {
                            "ip": "1.2.3.4",
                            "net": "3.4.5.6",
                            "netlen": "24",
                            "netmask": "255.255.255.0",
                            "broadcast": "7.8.9.1"
                    }
            }

实际上应该是这样的:添加了缺少的大括号。。。前两个和后两个

{"fwt-master2": { "ipv4": { "rtr": { "ip": "1.2.3.4", "net": "3.4.5.6", "netlen": "24", "netmask": "255.255.255.0", "broadcast": "7.8.9.1" }}}}

好吧,它发生了。。。因此,有趣的是,上面更新的一本是实际的字典,所以这里是如何实现您的目标:

>>> d = {"fwt-master2": { "ipv4": { "rtr": { "ip": "1.2.3.4", "net": "3.4.5.6", "netlen": "24", "netmask": "255.255.255.0", "broadcast": "7.8.9.1" }}}}
>>> obj = []
>>> obj.append(d)
>>> obj
[{'fwt-master2': {'ipv4': {'rtr': {'net': '3.4.5.6', 'netlen': '24', 'ip': '1.2.3.4', 'netmask': '255.255.255.0', 'broadcast': '7.8.9.1'}}}}]
>>> key_list = ['netmask', 'broadcast', 'ip', 'net']
>>> def recursive_items(dictionary):
...     for key, value in dictionary.items():
...         if type(value) is dict:
...             yield from recursive_items(value)
...         else:
...             yield (key, value)
...
>>> def find_key(obj):
...     for e in obj:
...         for key, value in recursive_items(e):
...             if key in key_list:
...                 print(key, value)
...         for key, value in recursive_items(e):
...             if key in key_list and value == 0:
...                 print(double_quote(key),":", value)
...
>>> find_key(obj)
net 3.4.5.6
ip 1.2.3.4
netmask 255.255.255.0
broadcast 7.8.9.1

玩得开心

相关问题 更多 >