Питон Список диктов к диктату списков - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь отформатировать структуру данных в соответствии с моими потребностями.Из списка диктов я хочу создать диктат списков.Исходя из этой структуры данных:

[{'accuracy': 0.04584040881114014,
  'epoch': 0,
  'loss': 3.908684137519228,
  'name': 'test14',
  'val_accuracy': 0.1878172606229782,
  'val_loss': 3.8432216644287114},
 {'accuracy': 0.1612903245539738,
  'epoch': 1,
  'loss': 3.8308442072066873,
  'name': 'test14',
  'val_accuracy': 0.1878172606229782,
  'val_loss': 3.4720854759216313},
 {'accuracy': 0.056027164736506485,
  'epoch': 0,
  'loss': 3.9064058800099866,
  'name': 'test15',
  'val_accuracy': 0.1878172606229782,
  'val_loss': 3.8064255714416495},
 {'accuracy': 0.16129032566713356,
  'epoch': 1,
  'loss': 3.7856348285448367,
  'name': 'test15',
  'val_accuracy': 0.1878172606229782,
  'val_loss': 3.5590925216674805}]

я хотел бы добиться чего-то подобного:

    {'test14': [{'accuracy': 0.04584040881114014,
       'epoch': 0,
       'loss': 3.908684137519228,
       'val_accuracy': 0.1878172606229782,
       'val_loss': 3.8432216644287114},
      {'accuracy': 0.1612903245539738,
       'epoch': 1,
       'loss': 3.8308442072066873,
       'val_accuracy': 0.1878172606229782,
       'val_loss': 3.4720854759216313}],
     'test15': [{'accuracy': 0.056027164736506485,
       'epoch': 0,
       'loss': 3.9064058800099866,
       'name': 'test15',
       'val_accuracy': 0.1878172606229782,
       'val_loss': 3.8064255714416495},
      {'accuracy': 0.16129032566713356,
       'epoch': 1,
       'loss': 3.7856348285448367,
       'name': 'test15',
       'val_accuracy': 0.1878172606229782,
       'val_loss': 3.5590925216674805}]}

So far I succeed to have something like that :

{'test14': {'accuracy': 0.1612903245539738,
  'epoch': 1,
  'loss': 3.8308442072066873,
  'val_accuracy': 0.1878172606229782,
  'val_loss': 3.4720854759216313},
 'test15': {'accuracy': 0.16129032566713356,
  'epoch': 1,
  'loss': 3.7856348285448367,
  'val_accuracy': 0.1878172606229782,
  'val_loss': 3.5590925216674805}}

Используя этот фрагмент кода:

for entry in data:
         name = entry.pop('name')
         n_dict[name] = entry

Но этоэто примечание, принимающее все значения.Требуется только один словарь на ключ.Я явно что-то здесь упускаю.Не могли бы вы зажечь меня на этом?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы перезаписываете свои данные - вам нужно добавить к ним:

for entry in data:
     name = entry.pop('name')
     n_dict[name] = entry  # this overwrites the value of name all the time

Исправить:

n_dict = {}
for entry in data:
     name = entry.pop('name')
     n_dict.setdefault(name,[])
     n_dict[name].append(entry)

(или использовать defaultdict изколлекций ), что более эффективно, чем использование dict.setdefault(...) - но для вашего образца данных оба должны работать.


Вывод:

{'test15': [{'loss': 3.9064058800099866, 'val_accuracy': 0.1878172606229782,
             'epoch': 0, 'val_loss': 3.8064255714416495, 
             'accuracy': 0.056027164736506485}, 
            {'loss': 3.7856348285448367, 'val_accuracy': 0.1878172606229782,
             'epoch': 1, 'val_loss': 3.5590925216674805, 
             'accuracy': 0.16129032566713356}], 
 'test14': [{'loss': 3.908684137519228, 'val_accuracy': 0.1878172606229782, 
             'epoch': 0, 'val_loss': 3.8432216644287114, 
             'accuracy': 0.04584040881114014}, 
            {'loss': 3.8308442072066873, 'val_accuracy': 0.1878172606229782, 
             'epoch': 1, 'val_loss': 3.4720854759216313, 
             'accuracy': 0.1612903245539738}]}
0 голосов
/ 27 ноября 2018

Я бы предложил использовать defaultdict

from collections import defaultdict

new_dict = defaultdict(list) # New entries will automatically be empty lists
for data_dict in old_list: # Cycle through your old data structure
    new_dict[data_dict['name']].append(data_dict) # Append to the list in the defaultdict with the key testname

Это дает:

defaultdict(list,
        {'test14': [{'accuracy': 0.04584040881114014,
           'epoch': 0,
           'loss': 3.908684137519228,
           'name': 'test14',
           'val_accuracy': 0.1878172606229782,
           'val_loss': 3.8432216644287114},
          {'accuracy': 0.1612903245539738,
           'epoch': 1,
           'loss': 3.8308442072066873,
           'name': 'test14',
           'val_accuracy': 0.1878172606229782,
           'val_loss': 3.4720854759216313}],
         'test15': [{'accuracy': 0.056027164736506485,
           'epoch': 0,
           'loss': 3.9064058800099866,
           'name': 'test15',
           'val_accuracy': 0.1878172606229782,
           'val_loss': 3.8064255714416495},
          {'accuracy': 0.16129032566713356,
           'epoch': 1,
           'loss': 3.7856348285448367,
           'name': 'test15',
           'val_accuracy': 0.1878172606229782,
           'val_loss': 3.5590925216674805}]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...