словарь Python - объединить два словаря и добавить значения ключа, если они совпадают - PullRequest
1 голос
/ 04 ноября 2019

У меня есть два списка словарей. Один находится во вложенном иерархическом формате, а другой - в простом списке словарей. Я пытаюсь сделать как «внешнее соединение», которое мы делаем в pandas или sql, как «соединение». По сути, я пытаюсь получить ключ / значение из словаря, в котором ключ / значение не существует в другом. Вот что я попробовал.

словарь 1: большие вложенные словари:

data = [
    {'file_name': 'abc.pdf',
     'year':'2016',
      'overview': {
          'student_id': '123abc',
           'name': 'Adam Smith',
           'courses': ['Math', 'Physics'],
           }},

    {'file_name': 'def.pdf',
     'year':'2017',
      'overview': {
          'student_id': '123abc',
           'name': 'Adam Smith',
           'courses': ['Arts'],
           }}
]

словарь 2:

mapper =[{
    'year':'2016',
    'student_id': '123abc',
    'counselor':'Matthews',
    'grades':'85'
}]

try / merging

pairs = zip(mapper,data)

try 1

[(x,y) for x, y in pairs if x['student_id'] == y['overview']['student_id']]

>> gives result:
[({'year': '2016',
   'student_id': '123abc',
   'counselor': 'Matthews',
   'grades': '85'},
  {'file_name': 'abc.pdf',
   'year': '2016',
   'overview': {'student_id': '123abc',
    'name': 'Adam Smith',
    'courses': ['Math', 'Physics']}})]

try 2:

[(x,y) for x, y in pairs if x['student_id'] == y['overview']['student_id'] & x['year'] == y['year']]
# gives errors: `TypeError: unsupported operand type(s) for &: 'str' and 'str'`

Попытка получить этот результат: если год и student_id в обоих словарях совпадают, то дайте эти результаты. Из словаря 2: я пытаюсь найти совпадение, если год и student_id совпадают, затем заполнить советник, «оценки» для словаря 1. Если они не совпадают, то с учетом элемента словаря.

new_data = [
    {'file_name': 'abc.pdf',
     'year':'2016',
      'overview': {
          'student_id': '123abc',
           'name': 'Adam Smith',
           'courses': ['Math', 'Physics'],
            'counselor':'Matthews',
            'grades':'85'
           }},

    {'file_name': 'def.pdf',
     'year':'2017',
      'overview': {
          'student_id': '123abc',
           'name': 'Adam Smith',
           'courses': ['Arts'],
           }}
]

1 Ответ

1 голос
/ 04 ноября 2019

Я думаю zip не будет хорошим вариантом в этом случае. Я бы объединил ['Overview'] dict данных с dict mapper:

for idx, i in enumerate(data):
    for j in mapper:
        if i['overview']['student_id'] in j['student_id'] and i['year'] == j['year']:
            data[idx]['overview'] = {**i['overview'], **j}
...