Python 3.x 如何从字典中的特定键中提取所有值?
我试图从这个示例字典中提取“externalIps”键的所有值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
{
"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']
你能在这个问题上加上你试过的吗我加上了我的无效代码谢谢。。如果没有其他人能想出什么办法,我就选一个效率不高的好办法!