Есть ли какая-либо функция для помещения словаря в словарь? - PullRequest
0 голосов
/ 07 января 2020

Прежде всего, я хочу открыть словарь и изменить ключ словаря. Я пытался использовать zip, но он не работает, как я хочу.

Это данные, которые у меня есть,

data= [{'id': 'abc001',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB023'},
                {'Answer': '3', 'QID': 'AB004'},
                {'Answer': '3', 'QID': 'AB006'}]},
      {'id': 'abc002',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB002'},
                {'Answer': '3', 'QID': 'AB003'},
                {'Answer': '3', 'QID': 'AB006'}]},
      {'id': 'abc003',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB002'},
                {'Answer': '3', 'QID': 'AB004'},
                {'Answer': '3', 'QID': 'AB005'}]}]

Я хочу изменить QID на другое имя, НО есть ответы, которые имеют этот QID, а затем другой ответ имеет другой QID, как в данных

Это имя, которое нужно изменить для QID:

QID 
AB001-gender
AB002-edu
AB003-qual
AB004-area
AB005-sal
AB006-living
AB023-job

Следовательно, это вывод, который мне нужен: Словарь только внутри демо.

Output=[{'id': 'abc001'
        'demo':{'gender':'1',
               'job':'6',
               'area':'3',
               'study':'3'}},
       {'id': 'abc002'
        'demo':{'gender':'1',
               'edu':'6',
               'qual':'3',
               'living':'3'}},
       {'id': 'abc003'
        'demo':{'gender':'1',
               'edu':'6',
               'area':'3',
               'sal':'3'}}]

Ответы [ 3 ]

1 голос
/ 07 января 2020

Вы можете просто сделать это:

mod_data = []
for demo in data:
    mod_demo = {'id': demo['id'], 'demo': {}}
    for answer in demo['demo']:
        key = mapping[answer['QID']]
        mod_demo['demo'][key] = answer['Answer']

    mod_data.append(mod_demo)

print(mod_data)
>>> [
    {'id': 'abc001', 'demo': {'gender': '1', 'job': '6', 'area': '3', 'living': '3'}},
    {'id': 'abc002', 'demo': {'gender': '1', 'edu': '6', 'qual': '3', 'living': '3'}},
    {'id': 'abc003', 'demo': {'gender': '1', 'edu': '6', 'area': '3', 'sal': '3'}}
]
0 голосов
/ 07 января 2020

Я пытался использовать это.

data= [{'id': 'abc001',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB023'},
                {'Answer': '3', 'QID': 'AB004'},
                {'Answer': '3', 'QID': 'AB006'}]},
      {'id': 'abc002',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB002'},
                {'Answer': '3', 'QID': 'AB003'},
                {'Answer': '3', 'QID': 'AB006'}]},
      {'id': 'abc003',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB002'},
                {'Answer': '3', 'QID': 'AB004'},
                {'Answer': '3', 'QID': 'AB005'}]}]

id_to_key = {
  'AB001': 'gender',
  'AB002': 'edu',
  'AB003': 'qual',
  'AB004': 'area',
  'AB005': 'sal',
  'AB006': 'living',
  'AB023': 'job'
}
import pprint

result = []
for item in data:
  d = {'id': item['id']}
  dd = {}
  for question in item['demo']:
    dd[id_to_key[question['QID']]] = question['Answer']
  d['demo'] = dd
  result.append(d)
pprint.pprint(result)
0 голосов
/ 07 января 2020

Я не удосужился протестировать его ... так что он может не работать из коробки

s= """AB001-gender
AB002-edu
AB003-qual
AB004-area
AB005-sal
AB006-living
AB023-job"""
# create a lookup table
id2name = dict(line.split("-",1) for line in s.splitlines())



data= [{'id': 'abc001',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB023'},
                {'Answer': '3', 'QID': 'AB004'},
                {'Answer': '3', 'QID': 'AB006'}]},
      {'id': 'abc002',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB002'},
                {'Answer': '3', 'QID': 'AB003'},
                {'Answer': '3', 'QID': 'AB006'}]},
      {'id': 'abc003',
       'demo': [{'Answer': '1', 'QID': 'AB001'},
                {'Answer': '6', 'QID': 'AB002'},
                {'Answer': '3', 'QID': 'AB004'},
                {'Answer': '3', 'QID': 'AB005'}]}]
def lookup_dict_data(d):
    # look up the id in our other dict we created earlier
    return id2name.get(d['QID'],d['QID']), d['Answer'])

for adict in data: # edit existing dict i guess
    adict['demo'] = dict(lookup_dict_data(d) for d in adict['demo'])
...