Arhn - архитектура программирования

Объединение 2 диктов с общими элементами в python

У меня есть следующий словарь:

{"states":[{"status": "BV"}, {"status": "CORR"}]}   

Как видно, это не простой словарь. Это словарь списков, списков, которые содержат словари.

У меня есть еще один словарь, который выглядит следующим образом:

{
"all_diseases": [
    {
        "status": "BV", 
        "median": 240.0,
        "disease_name": "Lupus"
    }, 
    {
        "status": "BV", 
        "median": 270.0,
        "disease_name": "Pulmonary Arterial Hypertension"
    }, 
    {
        "status": "CORR", 
        "median": 480.0,
        "disease_name": "Lupus"
    }, 
    {
        "status": "CORR", 
        "median": 600.0,
        "disease_name": "Pulmonary Arterial Hypertension"
    }, 
  ]
}

Это также список списков, списков, содержащих словари. ключ состояния является здесь общим элементом. Как я могу объединить эти 2 структуры, чтобы получить такой вывод:

{
"output": 
        [
          {
            "status":"BV",
            "data":
                    [
                      {
                        "median": 240.0,
                        "disease_name": "Lupus"
                      },
                      {
                        "median": 270.0, 
                        "disease_name": "Pulmonary Arterial Hypertension"
                      }
                    ]        
          },               
          {
            "status":"CORR",
            "data":
                    [
                      {
                        "median": 480.0,
                        "disease_name": "Lupus"
                      },
                      {
                        "median": 600.0, 
                        "disease_name": "Rheumatology"
                      }
                    ]        
           }
         ]
}
04.09.2015

  • похоже, вы просто собираете объекты с одинаковым статусом? 04.09.2015
  • да .. именно то, что я пытаюсь сделать .. но важно получить структуру конечного вывода 04.09.2015
  • насколько глубоко может быть вложенность? 04.09.2015
  • это максимум что получается.. 04.09.2015
  • при чем здесь первый дикт? 04.09.2015
  • теперь, когда вы упомянули об этом ... я вижу, что это излишне :-) 04.09.2015

Ответы:


1

Вы в основном группируете по штатам; вам действительно не нужен первый словарь здесь:

states = {}
for disease in seconddict['all_diseases']:
    state = disease.pop('status')
    states.setdefault(state, []).append(disease)

после чего вы можете создать свой вывод:

output = {'output': [
    {'status': status, 'data': diseases}
    for status, diseases in states.iteritems()]}

Демо:

>>> states = {}
>>> for disease in seconddict['all_diseases']:
...     state = disease.pop('status')
...     states.setdefault(state, []).append(disease)
... 
>>> states
{'BV': [{'disease_name': 'Lupus', 'median': 240.0}, {'disease_name': 'Pulmonary Arterial Hypertension', 'median': 270.0}], 'CORR': [{'disease_name': 'Lupus', 'median': 480.0}, {'disease_name': 'Pulmonary Arterial Hypertension', 'median': 600.0}]}
>>> from pprint import pprint
>>> output = {'output': [
...     {'status': status, 'data': diseases}
...     for status, diseases in states.iteritems()]}
>>> pprint(output)
{'output': [{'data': [{'disease_name': 'Lupus', 'median': 240.0},
                      {'disease_name': 'Pulmonary Arterial Hypertension',
                       'median': 270.0}],
             'status': 'BV'},
            {'data': [{'disease_name': 'Lupus', 'median': 480.0},
                      {'disease_name': 'Pulmonary Arterial Hypertension',
                       'median': 600.0}],
             'status': 'CORR'}]}
04.09.2015
  • спасибо ... имеет смысл ... вы ответили на многие мои вопросы о SO ... жизнь была бы намного сложнее без вашего опыта ... 04.09.2015
  • Я бы предпочел использовать collections.defaultdict для states вместо метода setdefault. Я лично считаю, что это красивее. 04.09.2015
  • @Santiago: требуется дополнительный импорт, что не всем нравится. У обоих подходов есть недостатки и преимущества, но, в конце концов, нет функциональной разницы, которая дает преимущество в решении этой конкретной проблемы. 05.09.2015

  • 2

    itertools.groupby — ваш друг, вам нужно будет реализовать ключевой критерий функции и передать его в качестве параметра.

    Вы можете использовать так:

    from itertools import groupby
    
    diseases = {
    "all_diseases": [
        {
            "status": "BV", 
            "median": 240.0,
            "disease_name": "Lupus"
        }, 
        {
            "status": "BV", 
            "median": 270.0,
            "disease_name": "Pulmonary Arterial Hypertension"
        }, 
        {
            "status": "CORR", 
            "median": 480.0,
            "disease_name": "Lupus"
        }, 
        {
            "status": "CORR", 
            "median": 600.0,
            "disease_name": "Pulmonary Arterial Hypertension"
        }, 
      ]
    }
    
    groups = groupby(diseases['all_diseases'], key=lambda item:item.get('status'))
    result = []
    
    for key_value, group_items in groups:
        result_item = {
            "status": key_value,
            "data": []
        }
    
        for group_item in group_items:
            del group_item["status"]
            result_item["data"].append(group_item)
    
        result.append(result_item)
    
    print result
    
    04.09.2015
  • Я не понимаю, почему этот ответ получил -1, поскольку он отвечает на вопрос. Как видно, я использовал только groupby, реализуя ключевую функцию. Остальное создает ответ. 04.09.2015
  • (Я не голосовал) groupby требует сортировки ввода. Если ввод еще не отсортирован, это меняет это решение с O (N) (как у меня) на O (NlogN). 04.09.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..