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

时间:2019-06-07 19:20:07

标签: python-3.x

我正在尝试从此示例字典中的“ 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。我已经尝试了很多事情,例如“ for key,value in”,以及我在网上搜索的其他事情。鉴于到处都有不同的密钥,我不确定如何仅引用“ externalIps”密钥并获取其值。

我最近得到的是这样的东西,它看起来效率极低,并且在我尝试转到key5时失败了

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.2,3.3.3.3,4.4.4.4,5.5.5.5

2 个答案:

答案 0 :(得分:3)

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

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']

答案 1 :(得分:1)

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

import re
data = {
    "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"
            }
        }
    },
}
results = re.findall(r"'externalIps'.*?'(.*?)'", str(data))
#print results
for result in results:
   print (result)

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

相关问题