Редактирование python словарных ключей во вложенных структурах - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть следующая структура для редактирования, и я не уверен, как это сделать. Например, мне нужно переименовать «Электронная почта» в «электронные письма» и иметь в качестве значения только адрес электронной почты.

{'input_text': 'some text',
 'lang': 'eng',
 'response': {'Certification': [{'CertificationName': 'some_name'}],
  'Email': [{'Address': 'someaddress@gmail.com', 'Label': 'personal'}],
  'ExecutiveSummary': ' text',
  'FamilyName': 'Smith',
  'FormattedName': 'John',
  'GivenName': 'John'}
}

Это то, что я хотел бы

{'input_text': 'some text',
 'lang': 'eng',
 'response': {'Certification': [{'CertificationName': 'some_name'}],
  'emails': ['someaddress@gmail.com'],
  'ExecutiveSummary': ' text',
  'FamilyName': 'Smith',
  'FormattedName': 'John',
  'GivenName': 'John'}

Я посмотрел на подобные вопросы и некоторую документацию, но все еще не могу понять это.

Ответы [ 4 ]

3 голосов
/ 25 февраля 2020

если d - ваш диктант, попробуйте следующее:

d['response']['emails'] = [i['Address'] for i in d['response']['Email']]
del d['response']['Email']

Или вы можете сделать это, используя pop в одну строку:

d['response']['emails'] = [i['Address'] for i in d['response'].pop('Email')]

Это даст вам :

 {'input_text': 'some text',
 'lang': 'eng',
 'response': {'Certification': [{'CertificationName': 'some_name'}],
  'ExecutiveSummary': ' text',
  'FamilyName': 'Smith',
  'FormattedName': 'John',
  'GivenName': 'John',
  'emails': ['someaddress@gmail.com']}}
1 голос
/ 25 февраля 2020

Я бы не стал переименовывать ключ, но вы могли бы просто создать «электронные письма» и затем заполнить его:

test_dict = {
    'input_text': 'some text',
    'lang': 'eng',
    'response': {
        'Certification': [{
            'CertificationName': 'some_name'
        }],
        'Email': [{
            'Address': 'someaddress@gmail.com',
            'Label': 'personal'
        }],
        'ExecutiveSummary': ' text',
        'FamilyName': 'Smith',
        'FormattedName': 'John',
        'GivenName': 'John'
    }
}
test_dict['response']['emails'] = [
    email['Address']
    for email in test_dict['response']['Email']
]

Редактировать: И, как упомянул @ h4z3, вы можете удалить, используя del или если вам нужно получить значение при его удалении pop

# Using del
del test_dict['response']['Email']

# Using pop
test_dict['response'].pop('Email')
0 голосов
/ 25 февраля 2020

Вы можете сделать новый ключ emails и после этого удалить старый:

>>> my_dict = {
...     'input_text': 'some text',
...     'lang': 'eng',
...     'response': {
...         'Certification': [
...             {
...                 'CertificationName': 'some_name'
...             }
...         ],
...         'Email': [
...             {
...                 'Address': 'someaddress@gmail.com', 
...                 'Label': 'personal'
...             }
...         ],
...         'ExecutiveSummary': ' text',
...         'FamilyName': 'Smith',
...         'FormattedName': 'John',
...         'GivenName': 'John'
...     }
... }
>>> my_dict['response']['emails'] = [d['Address'] for d in my_dict['response']['Email']]
>>> my_dict['response'].pop('Email', None)
>>> print(my_dict)
    {
...     'input_text': 'some text',
...     'lang': 'eng',
...     'response': {
...         'Certification': [
...             {
...                 'CertificationName': 'some_name'
...             }
...         ],
...         'ExecutiveSummary': ' text',
...         'FamilyName': 'Smith',
...         'FormattedName': 'John',
...         'GivenName': 'John',
...         'emails': ['someaddress@gmail.com']
...     }
... }
0 голосов
/ 25 февраля 2020

Если вы знаете, что будет только 'Email':

from ast import literal_eval

od = {'input_text': 'some text',
 'lang': 'eng',
 'response': {'Certification': [{'CertificationName': 'some_name'}],
  'Email': [{'Address': 'someaddress@gmail.com', 'Label': 'personal'}],
  'ExecutiveSummary': ' text',
  'FamilyName': 'Smith',
  'FormattedName': 'John',
  'GivenName': 'John'}}

od['response']['Email'] = [od['response']['Email'][0]['Address']]
print(literal_eval(str(od).replace('Email:', 'email:')))

{'input_text': 'some text',
 'lang': 'eng',
 'response': {'Certification': [{'CertificationName': 'some_name'}],
  'Email': ['someaddress@gmail.com'],
  'ExecutiveSummary': ' text',
  'FamilyName': 'Smith',
  'FormattedName': 'John',
  'GivenName': 'John'}}
...