我有下面的dict,它由一个列表组成
response = client.describe_auto_scaling_groups()
print(type(response),'\n')
for key,value in response.items():
print(type(value))
print(len(value))其结果是
<class 'dict'>
<class 'list'>
2
<class 'dict'>
4我只对列表输出感兴趣,当我进一步挖掘列表中的数据类型时,我会得到
for key,value in response.items():
print(type(value))
print(len(value))
for lst in value:
print(type(lst))我得到了
<class 'dict'>
<class 'list'>
2
<class 'dict'>
<class 'dict'>
<class 'dict'>
4
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>基本上,我有一个dict对象,它有一个列表对象(对应于2个自动缩放组),其中包含4个str对象。
response对象如下所示
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* {'AutoScalingGroups': [{'AutoScalingGroupName': 'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'AutoScalingGroupARN': 'arn:aws:autoscaling:ca-central-1:744734775600:autoScalingGroup:e700fbf0-178e-4ff8-8687-6b7103af5b65:autoScalingGroupName/eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'MixedInstancesPolicy': {'LaunchTemplate': {'LaunchTemplateSpecification': {'LaunchTemplateId': 'lt-0477d3fffb684214d', 'LaunchTemplateName': 'eks-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'Version': '1'}, 'Overrides': [{'InstanceType': 't3.2xlarge'}]}, 'InstancesDistribution': {'OnDemandAllocationStrategy': 'prioritized', 'OnDemandBaseCapacity': 0, 'OnDemandPercentageAboveBaseCapacity': 0, 'SpotAllocationStrategy': 'capacity-optimized'}}, 'MinSize': 3, 'MaxSize': 6, 'DesiredCapacity': 3, 'DefaultCooldown': 300, 'AvailabilityZones': ['ca-central-1d', 'ca-central-1b', 'ca-central-1a'], 'LoadBalancerNames': [], 'TargetGroupARNs': ['arn:aws:elasticloadbalancing:ca-central-1:744734775600:targetgroup/eks-ingress-http/3dfa91118f700452', 'arn:aws:elasticloadbalancing:ca-central-1:744734775600:targetgroup/eks-ingress/e4a924db58da487a'], 'HealthCheckType': 'EC2', 'HealthCheckGracePeriod': 15, 'Instances': [{'InstanceId': 'i-020d70d503bc32dbc', 'InstanceType': 't3.2xlarge', 'AvailabilityZone': 'ca-central-1b', 'LifecycleState': 'InService', 'HealthStatus': 'Healthy', 'LaunchTemplate': {'LaunchTemplateId': 'lt-0477d3fffb684214d', 'LaunchTemplateName': 'eks-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'Version': '1'}, 'ProtectedFromScaleIn': False}, {'InstanceId': 'i-05da68bac7b47b5f6', 'InstanceType': 't3.2xlarge', 'AvailabilityZone': 'ca-central-1a', 'LifecycleState': 'InService', 'HealthStatus': 'Healthy', 'LaunchTemplate': {'LaunchTemplateId': 'lt-0477d3fffb684214d', 'LaunchTemplateName': 'eks-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'Version': '1'}, 'ProtectedFromScaleIn': False}, {'InstanceId': 'i-099e1d57a3cb55d93', 'InstanceType': 't3.2xlarge', 'AvailabilityZone': 'ca-central-1d', 'LifecycleState': 'InService', 'HealthStatus': 'Healthy', 'LaunchTemplate': {'LaunchTemplateId': 'lt-0477d3fffb684214d', 'LaunchTemplateName': 'eks-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'Version': '1'}, 'ProtectedFromScaleIn': False}], 'CreatedTime': datetime.datetime(2022, 10, 11, 20, 29, 50, 226000, tzinfo=tzutc()), 'SuspendedProcesses': [], 'VPCZoneIdentifier': 'subnet-0286d381da9f5fa9c,subnet-0fc58322f447bae71,subnet-0381004140a514844', 'EnabledMetrics': [{'Metric': 'GroupInServiceCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupTotalInstances', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolDesiredCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupDesiredCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupAndWarmPoolDesiredCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupAndWarmPoolTotalCapacity', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolTerminatingCapacity', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolMinSize', 'Granularity': '1Minute'}, {'Metric': 'GroupMinSize', 'Granularity': '1Minute'}, {'Metric': 'GroupInServiceInstances', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolPendingCapacity', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolWarmedCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupStandbyCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupTerminatingInstances', 'Granularity': '1Minute'}, {'Metric': 'GroupMaxSize', 'Granularity': '1Minute'}, {'Metric': 'GroupPendingInstances', 'Granularity': '1Minute'}, {'Metric': 'GroupStandbyInstances', 'Granularity': '1Minute'}, {'Metric': 'GroupTerminatingCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupPendingCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupTotalCapacity', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolTotalCapacity', 'Granularity': '1Minute'}], 'Tags': [{'ResourceId': 'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'ResourceType': 'auto-scaling-group', 'Key': 'eks:cluster-name', 'Value': 'dev-build', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'ResourceType': 'auto-scaling-group', 'Key': 'eks:nodegroup-name', 'Value': 'core-20221011202902697400000006', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'ResourceType': 'auto-scaling-group', 'Key': 'k8s.io/cluster-autoscaler/dev-build', 'Value': 'owned', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'ResourceType': 'auto-scaling-group', 'Key': 'k8s.io/cluster-autoscaler/enabled', 'Value': 'true', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241', 'ResourceType': 'auto-scaling-group', 'Key': 'kubernetes.io/cluster/dev-build', 'Value': 'owned', 'PropagateAtLaunch': True}], 'TerminationPolicies': ['AllocationStrategy', 'OldestLaunchTemplate', 'OldestInstance'], 'NewInstancesProtectedFromScaleIn': False, 'ServiceLinkedRoleARN': 'arn:aws:iam::744734775600:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling', 'CapacityRebalance': True}, {'AutoScalingGroupName': 'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'AutoScalingGroupARN': 'arn:aws:autoscaling:ca-central-1:744734775600:autoScalingGroup:e18ade5c-2740-4648-85b5-d7d6b3253629:autoScalingGroupName/eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'MixedInstancesPolicy': {'LaunchTemplate': {'LaunchTemplateSpecification': {'LaunchTemplateId': 'lt-0fda9790b0b400c88', 'LaunchTemplateName': 'eks-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'Version': '1'}, 'Overrides': [{'InstanceType': 't3.xlarge'}]}, 'InstancesDistribution': {'OnDemandAllocationStrategy': 'prioritized', 'OnDemandBaseCapacity': 0, 'OnDemandPercentageAboveBaseCapacity': 0, 'SpotAllocationStrategy': 'capacity-optimized'}}, 'MinSize': 0, 'MaxSize': 10, 'DesiredCapacity': 0, 'DefaultCooldown': 300, 'AvailabilityZones': ['ca-central-1d', 'ca-central-1b', 'ca-central-1a'], 'LoadBalancerNames': [], 'TargetGroupARNs': [], 'HealthCheckType': 'EC2', 'HealthCheckGracePeriod': 15, 'Instances': [], 'CreatedTime': datetime.datetime(2022, 10, 11, 20, 29, 41, 507000, tzinfo=tzutc()), 'SuspendedProcesses': [], 'VPCZoneIdentifier': 'subnet-0286d381da9f5fa9c,subnet-0fc58322f447bae71,subnet-0381004140a514844', 'EnabledMetrics': [{'Metric': 'GroupStandbyCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupPendingInstances', 'Granularity': '1Minute'}, {'Metric': 'GroupPendingCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupTerminatingCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupTotalCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupTerminatingInstances', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolMinSize', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolTerminatingCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupInServiceInstances', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolWarmedCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupMaxSize', 'Granularity': '1Minute'}, {'Metric': 'GroupTotalInstances', 'Granularity': '1Minute'}, {'Metric': 'GroupInServiceCapacity', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolDesiredCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupAndWarmPoolDesiredCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupAndWarmPoolTotalCapacity', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolPendingCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupDesiredCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupMinSize', 'Granularity': '1Minute'}, {'Metric': 'WarmPoolTotalCapacity', 'Granularity': '1Minute'}, {'Metric': 'GroupStandbyInstances', 'Granularity': '1Minute'}], 'Tags': [{'ResourceId': 'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'ResourceType': 'auto-scaling-group', 'Key': 'eks:cluster-name', 'Value': 'dev-build', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'ResourceType': 'auto-scaling-group', 'Key': 'eks:nodegroup-name', 'Value': 'dip-jobs-2022101120290341260000000d', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'ResourceType': 'auto-scaling-group', 'Key': 'k8s.io/cluster-autoscaler/dev-build', 'Value': 'owned', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'ResourceType': 'auto-scaling-group', 'Key': 'k8s.io/cluster-autoscaler/enabled', 'Value': 'true', 'PropagateAtLaunch': True}, {'ResourceId': 'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0', 'ResourceType': 'auto-scaling-group', 'Key': 'kubernetes.io/cluster/dev-build', 'Value': 'owned', 'PropagateAtLaunch': True}], 'TerminationPolicies': ['AllocationStrategy', 'OldestLaunchTemplate', 'OldestInstance'], 'NewInstancesProtectedFromScaleIn': False, 'ServiceLinkedRoleARN': 'arn:aws:iam::744734775600:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling', 'CapacityRebalance': True}], 'ResponseMetadata': {'RequestId': 'e4d9be35-53d6-4efe-b66e-bc6ad1f91a19', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'e4d9be35-53d6-4efe-b66e-bc6ad1f91a19', 'content-type': 'text/xml', 'content-length': '17188', 'vary': 'accept-encoding', 'date': 'Wed, 19 Oct 2022 20:17:05 GMT'}, 'RetryAttempts': 0}}
*/我的最终目标是为位于主dict对象内部的2个list对象中的每个list对象提取AutoScalingGroupName和DesiredCapacity。
到目前为止我的代码是
for key,value in response.items():
for k in value:
for keyy,valuee in k.items():
if keyy == 'AutoScalingGroupName':
print(valuee)
elif keyy == 'DesiredCapacity':
print(valuee)这给了我
eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241
3
eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0
0
Traceback (most recent call last):
File "/Users/me/Work/gitlab/img-asg-exporter/aws.py", line 62, in <module>
get_asg_names()
File "/Users/me/Work/gitlab/img-asg-exporter/aws.py", line 55, in get_asg_names
for keyy,valuee in k.items():
AttributeError: 'str' object has no attribute 'items'我理解为什么会出现错误,并且我知道如何修复它。我的问题是,这是否是提取这样的值的最佳方法?最后,我希望将这些值附加到一个新的dict中,并使其类似于
final = {
"eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241": "3",
"eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0": "0"
}发布于 2022-10-19 20:47:58
在你的问题中有很多复杂的问题来解决一个看似相对简单的问题。
您似乎在问:如何将'AutoScalingGroupName'和'DesiredCapacity'值从主字典response中的'AutoScalingGroups'列表中的字典中获取,并将它们存储在结构为name: capacity的新字典中。
所以,简单地说:
result = {
asg['AutoScalingGroupName']: asg['DesiredCapacity']
for asg in response['AutoScalingGroups']
}response字典其他部分的类型和值与组的实际数量一样,都是无关紧要的。只要每个自动缩放组都有一个组名和一个容量,上面的内容就能满足您的需要。
发布于 2022-10-19 20:47:07
您可以在response['AutoScalingGroups'] (列表)中迭代,并使用dict-解析式从字典中获取值。
result = {
item['AutoScalingGroupName']:item['DesiredCapacity']
for item in response['AutoScalingGroups']
}结果:
{'eks-core-20221011202902697400000006-6ac1e45e-44ee-4a43-166c-12d3d432e241': 3,
'eks-dip-jobs-2022101120290341260000000d-9ec1e45e-4631-847b-b82d-d42d0fc330f0': 0}https://stackoverflow.com/questions/74131561
复制相似问题