Как получить доступ к значениям в сложном вложенном множественном значении python dictonary - PullRequest
0 голосов
/ 02 мая 2020
  • У меня есть словарь в формате ниже. Это одна строка, но я отформатировал ее здесь. Обратите внимание на вложенный ключ «SshPublicKeys», который имеет вложенную группу «ключ-значение» в квадратных скобках.
{
    'ServerId': 'string',
    'User': {
        'HomeDirectory': 'string',
        'SshPublicKeys': [
            {
                'DateImported': datetime(2015, 1, 1),
                'SshPublicKeyId': '123'
            },
                        {
                'DateImported': datetime(2018, 1, 1),
                'SshPublicKeyId': '456'
            },
        ],
        'UserName': 'string'
    }
}
  • В этом формате как получить доступ ко всем парам ключ-значение "SshPublicKeyId"? Окончательный результат должен выглядеть как показано ниже или просто близко к нему.
'SshPublicKeyId': '123' 
'SshPublicKeyId': '456'

Ответы [ 4 ]

1 голос
/ 02 мая 2020
for public_key in dicta["User"]["SshPublicKeys"]:
    print(f"'SshPublicKeyId': '{public_key['SshPublicKeyId']}'")

Выход:

'SshPublicKeyId': '123'
'SshPublicKeyId': '456'
1 голос
/ 02 мая 2020

Это можно сделать с помощью цепочки доступа к элементу, как показано ниже.

Предполагая, что основной словарь имеет имя d, для доступа к словарю 'User' вам нужно будет сделать d['User'], то есть:

d['User'] = {
    'HomeDirectory': 'string',
    'SshPublicKeys': [
        {
            'DateImported': datetime(2015, 1, 1),
            'SshPublicKeyId': '123'
        },
        {
            'DateImported': datetime(2018, 1, 1),
            'SshPublicKeyId': '456'
        },
    ],
    'UserName': 'string
}

Для доступа к списку 'SshPublicKeys' из d['User'] do d['User']['SshPublicKeys'], то есть:

d['User']['SshPublicKeys'] = [
    {
        'DateImported': datetime(2015, 1, 1),
        'SshPublicKeyId': '123'
    },
    {
        'DateImported': datetime(2018, 1, 1),
        'SshPublicKeyId': '456'
    },
]

Теперь для доступа к первому словарю из d['User']['SshPublicKeys'] вам нужно сделать d['User']['SshPublicKeys'][0], то есть:

d['User']['SshPublicKeys'][0] = {
    'DateImported': datetime(2015, 1, 1),
    'SshPublicKeyId': '123'
}

Наконец, как вы уже догадались, получить 'SshPublicKeyId' do d['User']['SshPublicKeys'][0]['SshPublicKeyId'], то есть:

>>> d['User']['SshPublicKeys'][0]['SshPublicKeyId']
'123'

Аналогично, d['User']['SshPublicKeys'][1]['SshPublicKeyId'] == '456' и т. д.


Будет лучше (и короче) написать функцию ИЛИ , сохранить ссылку на d['User']['SshPublicKeys'] и индексировать ее, если вам нужно сделать это повторно - - в зависимости от того, что соответствует вашим потребностям.

1 голос
/ 02 мая 2020

Попробуйте:

res = [{'SshPublicKeyId': x['SshPublicKeyId']} for x in d['User']['SshPublicKeys']]

Вывод:

[{'SshPublicKeyId': '123'}, {'SshPublicKeyId': '456'}]

Если вы хотите вывести в виде строки

res = ['SshPublicKeyId: ' + x['SshPublicKeyId'] for x in d['User']['SshPublicKeys']]

Выход:

['SshPublicKeyId: 123', 'SshPublicKeyId: 456']
0 голосов
/ 02 мая 2020

Понимание списка может быть очень полезным в вашем случае:

 [user_key['SshPublicKeyId'] 
 for user_key in main_dict['User']['SshPublicKeys']]
...