Python 3.x 如何从字典中的特定键中提取所有值?

Python 3.x 如何从字典中的特定键中提取所有值?,python-3.x,Python 3.x,我试图从这个示例字典中提取“externalIps”键的所有值 { "a": {}, "b": {}, "c": {}, "d": { "us-east1-b": { "vm1": { "externalIps": [ "1.1.1.1" ], "resourceowner": "bob@b

我试图从这个示例字典中提取“externalIps”键的所有值

{
    "a": {},
    "b": {},
    "c": {},
    "d": {
        "us-east1-b": {
            "vm1": {
                "externalIps": [
                    "1.1.1.1"
                ],
                "resourceowner": "bob@bob.com"
            }
        }
    },
    "e": {
        "us-east1-b": {
            "vm2": {
                "externalIps": [
                    "2.2.2.2"
                ],
                "resourceowner": "jane@jane.com"
            },
            "vm3": {
                "externalIps": [
                    "3.3.3.3"
                ],
                "resourceowner": "joe@joe.com"
            },
            "vm4": {
                "externalIps": [
                    "4.4.4.4"
                ],
                "resourceowner": "susan@susan.com"
            }
        }
    },
    "f": {},
    "g": {
        "us-east1-b": {
            "vm5": {
                "externalIps": [
                    "5.5.5.5"
                ],
                "resourceowner": "tim@tim.com"
            }
        }
    },
}
我正在linux上使用python 3.7.3。我尝试过很多东西,比如“为关键,为价值”,以及我在网上搜索的其他东西。由于到处都有不同的键,我不知道如何引用“externalIps”键并获取其值

我得到的最接近的是类似这样的东西,它看起来效率非常低,当我尝试转到键5时失败了

for key1 in json_data.keys():
    for key2 in json_data[key1].keys():
        for key3 in json_data[key1][key2].keys():
            for key4 in json_data[key1][key2][key3].keys():
                print(key4)
我希望结果是这样的:


1.1.1.1,2.2.2,3.3.3,4.4.4,5.5.5.5

简单的方法是只使用正则表达式:

重新导入
数据={
“a”:{},
“b”:{},
“c”:{},
“d”:{
“us-east1-b”:{
“vm1”:{
“外部性”:[
"1.1.1.1"
],
“资源所有者”:bob@bob.com"
}
}
},
“e”:{
“us-east1-b”:{
“vm2”:{
“外部性”:[
"2.2.2.2"
],
“资源所有者”:jane@jane.com"
},
“vm3”:{
“外部性”:[
"3.3.3.3"
],
“资源所有者”:joe@joe.com"
},
“vm4”:{
“外部性”:[
"4.4.4.4"
],
“资源所有者”:susan@susan.com"
}
}
},
“f”:{},
“g”:{
“us-east1-b”:{
“vm5”:{
“外部性”:[
"5.5.5.5"
],
“资源所有者”:tim@tim.com"
}
}
},
}
结果=re.findall(r“'externalIps.*?”(.*?”),str(数据))
#打印结果
对于结果中的结果:
打印(结果)

但这是一种基本方法,可能效率不高。

您可以使用递归来完成所需的工作:

d = {
    "a": {},
    "b": {},
    "c": {},
    "d": {
        "us-east1-b": {
            "vm1": {
                "externalIps": [
                    "1.1.1.1"
                ],
                "resourceowner": "bob@bob.com"
            }
        }
    },
    "e": {
        "us-east1-b": {
            "vm2": {
                "externalIps": [
                    "2.2.2.2"
                ],
                "resourceowner": "jane@jane.com"
            },
            "vm3": {
                "externalIps": [
                    "3.3.3.3"
                ],
                "resourceowner": "joe@joe.com"
            },
            "vm4": {
                "externalIps": [
                    "4.4.4.4"
                ],
                "resourceowner": "susan@susan.com"
            }
        }
    },
    "f": {},
    "g": {
        "us-east1-b": {
            "vm5": {
                "externalIps": [
                    "5.5.5.5"
                ],
                "resourceowner": "tim@tim.com"
            }
        }
    },
}

def fn(d, rv):
    for k, v in d.items():
        if k == 'externalIps':
            rv.append(v[0])
        if isinstance(v, dict):
            fn(v, rv)

l = []
fn(d, rv=l)
print(l)
印刷品:

['1.1.1.1', '2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5']

你能在这个问题上加上你试过的吗我加上了我的无效代码谢谢。。如果没有其他人能想出什么办法,我就选一个效率不高的好办法!