我正在尝试从此示例字典中的“ 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
答案 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)
这是一种基本方法,但可能效率不高。