Как создать список значений из словарного массива? - PullRequest
1 голос
/ 17 мая 2019

Я пишу скрипт на Python с использованием Boto. Когда я делаю описание, я получаю список из 10 пунктов. Вот пример вывода:

[{
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED5ac93e9d-18fb-49a0-bd93-9b23c81f23bd",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:54.458000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED67080365-2d7d-4f63-8d74-ab67995b7f55",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:50.932000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED30e49b6a-0729-42aa-bcea-7a5f1d15368e",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:47.118000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED8226db8a-7d54-4495-882f-9f4e2a09757b",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:43.011000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED269202de-d110-4cc2-8a58-b60d830ff188",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:38.433000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED4d6677ff-8250-4d3a-bb06-ebf5efd59079",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:34.988000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED973f686a-f03f-4a28-a966-129e3f36d0f0",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:32.072000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED067b4edf-e984-4595-8d96-89e5cdcb82ee",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:29.616000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED21b61601-6342-4e23-b3c3-d4384eccdd61",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:24.326000-04:00",
    "statusCode": "upcoming"
}, {
    "arn": "arn:aws:health:us-east-1::event/EC2/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED/AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED13bf770d-9a7a-4434-be3d-9d4f1d162d66",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
    "eventTypeCategory": "scheduledChange",
    "region": "us-east-1",
    "startTime": "2019-05-31 13:00:00-04:00",
    "endTime": "2019-05-31 13:00:00-04:00",
    "lastUpdatedTime": "2019-05-17 13:29:21.642000-04:00",
    "statusCode": "upcoming"
}]

Теперь я хочу создать список только с ARN каждого элемента. Я могу перебрать каждый элемент как:

for i in len(var1):
  var2.append(var1[i]['arn']
print var2

но есть ли лучший способ написания этого цикла?

Ответы [ 3 ]

1 голос
/ 18 мая 2019

Понимание списка сделает это наиболее компактно:

arns = [x['arn'] for x in data]
0 голосов
/ 18 мая 2019

Добавление третьего ответа с улучшенной обработкой ошибок. Вы можете использовать метод словаря .get(), чтобы безопасно получить значение из своего словаря. Это позволяет вам контролировать поведение, если по какой-то причине 'arn' нет в словаре, а ваш код не работает.

arns = [x.get('arn', 'missing arn') for x in data]

если под лучшим вы подразумеваете самый быстрый, то лучше всего использовать строгое понимание списка, примерно в 2 раза больше для цикла в 2,25 раза быстрее, чем для понимания списка с помощью get. Если скорость является вашим наивысшим приоритетом, и вы знаете, что у вас всегда будет arn в вашем задании, используйте понимание списка. Если вас беспокоит отсутствие arn, используйте метод .get().

def list_comp(data):
    return [x['arn'] for x in data]

def for_loop(data):
    var2 = []
    for thing in data:
        var2.append(thing['arn'])
    return var2

def list_comp_get(data):
    return [x.get('arn', 'missing arn') for x in data]

%timeit list_comp(arns)
561 ns ± 4.78 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit for_loop(arns)
910 ns ± 2.59 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit list_comp_get(arns)
1.22 µs ± 1.32 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

list_comp(arns) == for_loop(arns) == list_comp_get(arns)
True
0 голосов
/ 18 мая 2019

Более идиотский способ сделать то же самое - выполнить итерацию по списку напрямую, а не отслеживать индекс:

for thing in var1:
    var2.append(thing['arn'])

Предполагая, var2 это list, в противном случае, если он работает, вы, вероятно, в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...