Как извлечь только определенные значения ключа из вывода dict? - PullRequest
0 голосов
/ 20 мая 2018

Как я могу извлечь все значения 'ImageId' из ожидаемого вывода ниже, который находится в структуре dict?

Я попытался извлечь все значения и преобразовать их в json и попытался извлечь, но это не такКажется, он не работает для меня или может быть не очень хорошим способом решения этой задачи.

Этот код взят из документации Boto3 от здесь .

Ожидаемый результат:

{
    'SpotFleetRequestConfigs': [
        {
            'SpotFleetRequestConfig': {
                'IamFleetRole': 'arn:aws:iam::123456789012:role/my-spot-fleet-role',
                'LaunchSpecifications': [
                    {
                        'EbsOptimized': False,
                        'ImageId': 'ami-1a2b3c4d',
                        'InstanceType': 'cc2.8xlarge',
                        'NetworkInterfaces': [
                            {
                                'AssociatePublicIpAddress': True,
                                'DeleteOnTermination': False,
                                'DeviceIndex': 0,
                                'SecondaryPrivateIpAddressCount': 0,
                                'SubnetId': 'subnet-a61dafcf',
                            },
                        ],
                    },
                    {
                        'EbsOptimized': False,
                        'ImageId': 'ami-1a2b3c4d',
                        'InstanceType': 'r3.8xlarge',
                        'NetworkInterfaces': [
                            {
                                'AssociatePublicIpAddress': True,
                                'DeleteOnTermination': False,
                                'DeviceIndex': 0,
                                'SecondaryPrivateIpAddressCount': 0,
                                'SubnetId': 'subnet-a61dafcf',
                            },
                        ],
                    },
                ],
                'SpotPrice': '0.05',
                'TargetCapacity': 20,
            },
            'SpotFleetRequestId': 'sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE',
            'SpotFleetRequestState': 'active',
        },
    ],
    'ResponseMetadata': {
        '...': '...',
    },
}

1 Ответ

0 голосов
/ 20 мая 2018

Вы можете использовать понимание списка:

res = [i['ImageId'] for i in \
       d['SpotFleetRequestConfigs'][0]['SpotFleetRequestConfig']['LaunchSpecifications']]

print(res)

['ami-1a2b3c4d', 'ami-1a2b3c4d']

Используются только 2 операции:

  1. Доступ к ключу словаря с помощью d[key].
  2. Доступ к элементу i списка через lst[i].

Самая сложная часть - определить, где у вас есть списки и словари.Я рекомендую вам взглянуть на каждую часть вашего ввода по одному шагу: словари идентифицируются с помощью {}, а списки [].

Настройка

d = {
    'SpotFleetRequestConfigs': [
        {
            'SpotFleetRequestConfig': {
                'IamFleetRole': 'arn:aws:iam::123456789012:role/my-spot-fleet-role',
                'LaunchSpecifications': [
                    {
                        'EbsOptimized': False,
                        'ImageId': 'ami-1a2b3c4d',
                        'InstanceType': 'cc2.8xlarge',
                        'NetworkInterfaces': [
                            {
                                'AssociatePublicIpAddress': True,
                                'DeleteOnTermination': False,
                                'DeviceIndex': 0,
                                'SecondaryPrivateIpAddressCount': 0,
                                'SubnetId': 'subnet-a61dafcf',
                            },
                        ],
                    },
                    {
                        'EbsOptimized': False,
                        'ImageId': 'ami-1a2b3c4d',
                        'InstanceType': 'r3.8xlarge',
                        'NetworkInterfaces': [
                            {
                                'AssociatePublicIpAddress': True,
                                'DeleteOnTermination': False,
                                'DeviceIndex': 0,
                                'SecondaryPrivateIpAddressCount': 0,
                                'SubnetId': 'subnet-a61dafcf',
                            },
                        ],
                    },
                ],
                'SpotPrice': '0.05',
                'TargetCapacity': 20,
            },
            'SpotFleetRequestId': 'sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE',
            'SpotFleetRequestState': 'active',
        },
    ],
    'ResponseMetadata': {
        '...': '...',
    },
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...