Как выполнить итерацию по вложенному списку, находящемуся внутри словаря?

#python #list #loops #dictionary #collections

Вопрос:

Я пытаюсь перебрать ключ «Ресурс», чтобы определить, удовлетворяет ли он какому-либо условию.

У меня есть пример использования, в котором мне нужно повторить каждый из ключей ресурсов, чтобы определить, равен ли он определенному значению. По сути, я просто проверяю, что политика имеет правильные разрешения.

 {'Action': ['s3:PutObject', 'kms:GenerateKey'],
'Effect': 'Allow'
'Resource': ['arn:aws:kms:us-west-2:<account_id>:key/*',
'arn:aws:s3:::bucket]}
 

Есть ли способ повторить каждое значение в списке ресурсов?

До сих пор у меня есть это

 for value in policy:
    Resource = value['Resource']
    for resource in Resources:
        if resource == 'arn:aws:s3:::bucket'
        return True
 

Однако я только что понял, что это работает не так, как ожидалось.

Комментарии:

1. что не работает? вы должны предоставить сведения об отладке. В вашем случае есть опечатка: вы назначаете Resource , но проходите Resources

2. Я думаю, что вам не хватает «в конце этой строки «Ресурс»: [«arn:aws:kms:us-west-2:<идентификатор учетной записи>:ключ/*», «arn:aws:s3:::ведро]

3. там также отсутствует запятая после 'Allow' и отступ под вашим «если»… Вы также должны удалить свой первый цикл и назначить Resources = policy['Resource']

Ответ №1:

Это то, что тебе нужно:

 for value in policy:
    Resource = value['Resource']
    if 'arn:aws:s3:::bucket' in Resource:
        return True
 

Если вы все еще хотите просмотреть список:

 for value in policy:
    Resource = value['Resource']
    for resource in Resource:
        if resource == 'arn:aws:s3:::bucket':
            return True
 

Пожалуйста, обратите внимание на опечатку в вашем коде: for resource in Resources: должно быть for resource in Resource: Вы добавили дополнительные буквы s в имя переменной Resource

Комментарии:

1. Существует ли также способ управления несколькими различными ресурсами в этой политике, которые являются отдельными действиями?

2. Вы имеете в виду получить ресурс и связанное с ним действие?

3. Первая коробка, кажется, сработала, спасибо.

Ответ №2:

Вы можете просто получить массив, соответствующий ключу «Ответ» в словаре, и выполнить итерацию по нему.

 dct = {'Action': ['s3:PutObject', 'kms:GenerateKey'],
'Effect': 'Allow'
'Resource': ['arn:aws:kms:us-west-2:<account_id>:key/*',
'arn:aws:s3:::bucket']}

resource = dct.get('Resource')
for array_element in resource:
    # do stuff as you wish with each array_element
 

Ответ №3:

У меня такое чувство, что ты действительно хочешь это сделать:

 bucket_policies = [
    each for each in policy 
    if 'arn:aws:s3:::bucket' in each['Resource']
]
 

Это позволит вам получить список политик в разделе политика, в котором есть этот ключ в ресурсе.

Ответ №4:

Ты хочешь этого:

 dct ={'Action': ['s3:PutObject', 'kms:GenerateKey'],'Effect':'Allow',
   'Resource': ['arn:aws:kms:us-west-2:<account_id>:key/*','arn:aws:s3:::bucket']}

for r in dct.get('Resource'):
    print(r)
 

Выход:

 arn:aws:kms:us-west-2:<account_id>:key/*
arn:aws:s3:::bucket
 

Вы можете использовать in и dct.get('Resource') как показано ниже:

 >>> print('arn:aws:s3:::bucket' in dct.get('Resource'))
True
>>> print('arn:aws:kms:us-west-2:<account_id>:key/*' in dct.get('Resource'))
True
>>> print('lara lara ' in  dct.get('Resource'))
False