2012-01-14 1 views
3

Я пытаюсь объединить два вложенных словаря Python. Каждый из них имеет 10 клавиш на верхнем уровне, а затем каждый из 10 клавиш имеет еще 2 клавиши: «datetimes» и «values». На низком уровне каждая клавиша вложенного словаря содержит около 100 000 элементов.Как создать вложенный в Python словарь из 2 файлов pkl/объединить 2 вложенных словаря в один?

Происхождение 2 словарей из 2 файлов pkl. Я разворачиваю их на 2 словаря, используя функцию загрузки. Есть ли способ иметь 1 словарь из этих 2 файлов pkl? Если нет, то как я могу объединить 2 словаря в один?

Я пробовал this solution, но он перезаписывает один словарь за другим, и я не мог получить this solution, поскольку у меня есть словари, а не списки с индексами, как в примере. Использование .copy(), как предложено here, также перезаписывает один словарь за другим. Было бы здорово, если бы я мог просто добавить один словарь к другому, но this post, похоже, предполагает, что словари не работают так.

Итак, я подумал, что, возможно, я смогу создавать массивы из этих словарей, а затем переформатировать их и объединить. Но это невероятно медленно. Вот то, что я до сих пор:

import cPickle 
import numpy as np 

def load(filename, verbose=False): 
    # Open file 
    if verbose : print("Loading %s" % filename) 
    pkl_file = open(filename, 'rb') 
    # Load from Pickle file. 
    data = cPickle.load(pkl_file) 
    pkl_file.close() 

    return data 

def combineDicts(dictList): 
    result = np.array([]) 
    for listItem in dictList: 
     data = np.array([]) 
     for item in listItem.keys(): 
      for innerItem in listItem[item].keys(): 
       data = np.append(data, listItem[item][innerItem]) 
     result = np.append(result, data) 

Так что я пытаюсь выполнить следующие команды:

>>> dict1 = load('file1.pkl', verbose = True) 
>>> dict2 = load('file2.pkl', verbose = True) 
>>> a = combineDicts([dict1, dict2]) 

ответ

2

Если я правильно понял ваш вопрос правильно, я думаю, что вы можете сделать то, что вы хотите использовать в Словаре понимание (Версия 3.x и 2.7):

>>> dict1 = {'topkey1': {'datetimes': [9,8], 'values': [7,6]}, 'topkey2': {'datetimes': [5,4], 'values': [3,2]}} 
>>> dict2 = {'topkey3': {'datetimes': [9,8], 'values': [7,6]}, 'topkey4': {'datetimes': [5,4], 'values': [3,2]}} 
>>> dictlist = [dict1, dict2] 
>>> new_dict = {key: value for item in dictlist for key, value in item.items()} 
>>> new_dict 
{'topkey4': {'values': [3, 2], 'datetimes': [5, 4]}, 'topkey1': {'values': [7, 6], 'datetimes': [9, 8]}, 'topkey3': {'values': [7, 6], 'datetimes': [9, 8]}, 'topkey2': {'values': [3, 2], 'datetimes': [5, 4]}} 

Если это не результат, который вы ищете, пожалуйста, приведите примеры исходной структуры Dict и то, что вы ищете в окончательной структуре Dict.

Edit:

На основании информации, предоставленной Вами в Ваш комментарий следующее должно помочь:

>>> dict1 = {'topkey1': {'datetimes': [9,8], 'values': [7,6]}, 'topkey2': {'datetimes': [5,4], 'values': [3,2]}} 
>>> dict2 = {'topkey1': {'datetimes': [29,28], 'values': [17,16]}, 'topkey2': {'datetimes': [35,34], 'values': [43,42]}} 
>>> for key, value in dict2.items(): 
...  for subkey, subvalue in value.items(): 
...   dict1[key][subkey] = dict1[key][subkey] + subvalue 
...  
>>> dict1 
{'topkey1': {'values': [7, 6, 17, 16], 'datetimes': [9, 8, 29, 28]}, 'topkey2': {'values': [3, 2, 43, 42], 'datetimes': [5, 4, 35, 34]}} 
+0

sgallen, в примере, вы даете topkey1 и topkey3 является reallt то же имя, так как словари имеют одинаковые верхние ключи. Различия между ними на самом деле имеют данные за один год, а другой - данные за другой год. Поэтому, если я изменяю ваш пример следующим образом: 'dict1 = {'topkey1': {'datetimes': [9,8], 'values': [7,6]}, 'topkey2': {'datetimes': [5 , 4], 'values': [3,2]}} ' ' dict2 = {'topkey1': {'datetimes': [29,28], 'values': [17,16]}, 'topkey2' : {'datetimes': [35,34], 'values': [43,42]}} ' – Aina

+0

, тогда вывод будет: ' {'topkey1': {'datetimes': [9,8,29,28 ], 'values': [7,6,17,16]}, 'topkey2': {'datetimes': [5,4,35,34], 'values': [3,2,43,42]} } 'Я думаю, что понимание понятий - путь, но мой 5-недельный опыт работы с Python не может меня достать. Я думаю, что ваше решение должно работать, если я каким-то образом модифицирую понимание, чтобы отразить результат, который я получаю после. Спасибо, Айна. – Aina

 Смежные вопросы

  • Нет связанных вопросов^_^