迭代Python dict

2w3kk1z5  于 2023-03-31  发布在  Python
关注(0)|答案(2)|浏览(130)

我有一个Boto3的响应(Python字典)如下:

{
    'TagDescriptions': [{
        'ResourceArn': 'arn:aws:elasticloadbalancing:eu-west-1:11111111111:loadbalancer/app/AXXX001PRO/e5ca75b7',
        'Tags': [{
            'Key': 'STACK',
            'Value': 'ATENEA-ELB-TWRHL6'
        }, {
            'Key': 'APP_NAME',
            'Value': 'XXX001_ATENEA'
        }, {
            'Key': 'Environment',
            'Value': 'PRO'
        }, {
            'Key': 'NAT_PROFILE',
            'Value': 'LOW'
        }, {
            'Key': 'Name',
            'Value': 'AXXX004PROBELB01'
        }]
    }],
    'ResponseMetadata': {
        'RequestId': 'f5fba49b',
        'HTTPStatusCode': 200,
        'HTTPHeaders': {
            'x-amzn-requestid': 'f5fba49b',
            'content-type': 'text/xml',
            'content-length': '1065',
            'date': 'Mon, 27 Mar 2023 16:15:01 GMT'
        },
        'RetryAttempts': 0
    }
}

需要迭代并只获取字符串等于APP_NAME的键的值。但知道位置是无效的,因为它可以改变。我测试了不同的方法,但不知道如何做到这一点。

2q5ifsrm

2q5ifsrm1#

假设可以有多个标签描述和多个标签,您需要做的就是在嵌套的for循环中迭代它们:

data = {
    'TagDescriptions': [{
        'ResourceArn': 'arn:aws:elasticloadbalancing:eu-west-1:11111111111:loadbalancer/app/AXXX001PRO/e5ca75b7',
        'Tags': [{
            'Key': 'STACK',
            'Value': 'ATENEA-ELB-TWRHL6'
        }, {
            'Key': 'APP_NAME',
            'Value': 'XXX001_ATENEA'
        }, {
            'Key': 'Environment',
            'Value': 'PRO'
        }, {
            'Key': 'NAT_PROFILE',
            'Value': 'LOW'
        }, {
            'Key': 'Name',
            'Value': 'AXXX004PROBELB01'
        }]
    }],
    'ResponseMetadata': {
        'RequestId': 'f5fba49b',
        'HTTPStatusCode': 200,
        'HTTPHeaders': {
            'x-amzn-requestid': 'f5fba49b',
            'content-type': 'text/xml',
            'content-length': '1065',
            'date': 'Mon, 27 Mar 2023 16:15:01 GMT'
        },
        'RetryAttempts': 0
    }
}

app_name = None
for tag_desc in data['TagDescriptions']:
    for tag in tag_desc['Tags']:
        if tag['Key'] == 'APP_NAME':
            app_name = tag['Value']
            break

print(app_name)

在这个例子中,我将变量app_name初始化为None,所以如果标签不存在,app_name仍然是None

oxf4rvwz

oxf4rvwz2#

使用嵌套的理解来迭代所有的TagDescriptions和这些描述中的所有Tags,然后过滤出匹配Key的一个或多个:

>>> res = {
...     'TagDescriptions': [{
...         'ResourceArn': 'arn:aws:elasticloadbalancing:eu-west-1:11111111111:loadbalancer/app/AXXX001PRO/e5ca75b7',
...         'Tags': [{
...             'Key': 'STACK',
...             'Value': 'ATENEA-ELB-TWRHL6'
...         }, {
...             'Key': 'APP_NAME',
...             'Value': 'XXX001_ATENEA'
...         }, {
...             'Key': 'Environment',
...             'Value': 'PRO'
...         }, {
...             'Key': 'NAT_PROFILE',
...             'Value': 'LOW'
...         }, {
...             'Key': 'Name',
...             'Value': 'AXXX004PROBELB01'
...         }]
...     }],
...     'ResponseMetadata': {
...         'RequestId': 'f5fba49b',
...         'HTTPStatusCode': 200,
...         'HTTPHeaders': {
...             'x-amzn-requestid': 'f5fba49b',
...             'content-type': 'text/xml',
...             'content-length': '1065',
...             'date': 'Mon, 27 Mar 2023 16:15:01 GMT'
...         },
...         'RetryAttempts': 0
...     }
... }
>>> [tag for desc in res['TagDescriptions'] for tag in desc['Tags'] if tag['Key'] == 'APP_NAME']
[{'Key': 'APP_NAME', 'Value': 'XXX001_ATENEA'}]

相关问题