Как получить значения из списка словарей в python? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь получить значения из указанного элемента c и добавить их в виде одного списка.

Ввод:

X = [
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "iam:CreateInstanceProfile",
                    "iam:DeleteInstanceProfile",
                    "iam:GetRole",
                    "iam:GetInstanceProfile",
                    "iam:GetPolicy",
                    "iam:ListGroupPolicies",
                    "iam:RemoveRoleFromInstanceProfile",
                    "iam:CreateRole",
                    "iam:DeleteRole",
                    "iam:PutRolePolicy",
                    "iam:ListInstanceProfiles",
                    "iam:GetGroup",
                    "iam:AddRoleToInstanceProfile",
                    "iam:PassRole",
                    "iam:GetUserPolicy",
                    "iam:DeleteRolePolicy",
                    "iam:UpdateRole",
                    "iam:GetGroupPolicy",
                    "iam:GetUser",
                    "iam:ListRolePolicies",
                    "iam:GetRolePolicy",
                ],
                "Resource": [
                    "arn:aws:iam::*:policy/*",
                    "arn:aws:iam::*:instance-profile/*",
                    "arn:aws:iam::*:user/*",
                    "arn:aws:iam::*:role/*",
                    "arn:aws:iam::*:group/*",
                ],
                "Effect": "Allow",
                "Sid": "VisualEditor0",
            },
            {
                "Action": ["iam:ListPolicies", "iam:ListRoles", "iam:ListGroups"],
                "Resource": "*",
                "Effect": "Allow",
                "Sid": "VisualEditor1",
            },
        ],
    }
]

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

Y = [
    "iam:CreateInstanceProfile",
    "iam:DeleteInstanceProfile",
    "iam:GetRole",
    "iam:GetInstanceProfile",
    "iam:GetPolicy",
    "iam:ListGroupPolicies",
    "iam:RemoveRoleFromInstanceProfile",
    "iam:CreateRole",
    "iam:DeleteRole",
    "iam:PutRolePolicy",
    "iam:ListInstanceProfiles",
    "iam:GetGroup",
    "iam:AddRoleToInstanceProfile",
    "iam:PassRole",
    "iam:GetUserPolicy",
    "iam:DeleteRolePolicy",
    "iam:UpdateRole",
    "iam:GetGroupPolicy",
    "iam:GetUser",
    "iam:ListRolePolicies",
    "iam:GetRolePolicy",
    "iam:ListPolicies",
    "iam:ListRoles",
    "iam:ListGroups",
]

Здесь я пытаюсь получить значения всех «действий» и сохранить их в виде одного списка. Как я могу это сделать?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Попробуйте:

Y = [j for i in [i['Action'] for i in X[0]['Statement']] for j in i]

Теперь вы можете распечатать его с помощью:

print(Y)

Обратите внимание, что рекомендуется не использовать строчные буквы в python при именовании переменных.


Если вам не нравятся Ultra-One-Liners, попробуйте:

Y = []
for i in [i['Action'] for i in X[0]['Statement']]:
    Y.append(j for j in i)

Если вам никогда не нравились One-Liners:

Y = []
for i in X[0]['Statement']:
    for j in i['Action']:
        Y.append(j)

Объяснение на одну строку:

  • Сначала он узнает i, что является всеми Action s в ваших X.
  • Затем он находит j , который является каждым элементом в i.

Здесь:

X = [
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "iam:CreateInstanceProfile",
                    "iam:DeleteInstanceProfile",
                    "iam:GetRole",
                    "iam:GetInstanceProfile",
                    "iam:GetPolicy",
                    "iam:ListGroupPolicies",
                    "iam:RemoveRoleFromInstanceProfile",
                    "iam:CreateRole",
                    "iam:DeleteRole",
                    "iam:PutRolePolicy",
                    "iam:ListInstanceProfiles",
                    "iam:GetGroup",
                    "iam:AddRoleToInstanceProfile",
                    "iam:PassRole",
                    "iam:GetUserPolicy",
                    "iam:DeleteRolePolicy",
                    "iam:UpdateRole",
                    "iam:GetGroupPolicy",
                    "iam:GetUser",
                    "iam:ListRolePolicies",
                    "iam:GetRolePolicy",
                ],
                "Resource": [
                    "arn:aws:iam::*:policy/*",
                    "arn:aws:iam::*:instance-profile/*",
                    "arn:aws:iam::*:user/*",
                    "arn:aws:iam::*:role/*",
                    "arn:aws:iam::*:group/*",
                ],
                "Effect": "Allow",
                "Sid": "VisualEditor0",
            },
            {
                "Action": ["iam:ListPolicies", "iam:ListRoles", "iam:ListGroups"],
                "Resource": "*",
                "Effect": "Allow",
                "Sid": "VisualEditor1",
            },
        ],
    }
]
0 голосов
/ 09 апреля 2020
Y=X[0]['Statement'][0]['Action']
0 голосов
/ 09 апреля 2020

Простая, аккуратная функция генератора:

def get_all_actions(documents):
    for doc in documents:
        for stmt in doc.get("Statement", []):
            yield from stmt.get("Action", [])

Использование вашего ввода:

>>> print(list(get_all_actions(X)))
['iam:CreateInstanceProfile', 'iam:DeleteInstanceProfile', 'iam:GetRole', 'iam:GetInstanceProfile', 'iam:GetPolicy', 'iam:ListGroupPolicies', 'iam:RemoveRoleFromInstanceProfile', 'iam:CreateRole', 'iam:DeleteRole', 'iam:PutRolePolicy', 'iam:ListInstanceProfiles', 'iam:GetGroup', 'iam:AddRoleToInstanceProfile', 'iam:PassRole', 'iam:GetUserPolicy', 'iam:DeleteRolePolicy', 'iam:UpdateRole', 'iam:GetGroupPolicy', 'iam:GetUser', 'iam:ListRolePolicies', 'iam:GetRolePolicy', 'iam:ListPolicies', 'iam:ListRoles', 'iam:ListGroups']
>>>
...