Как создать вложенный словарь Python из 2 файлов pkl / объединить 2 вложенных словаря в один? - PullRequest
3 голосов
/ 14 января 2012

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

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

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

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

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])

1 Ответ

2 голосов
/ 14 января 2012

Если я правильно понимаю вашу проблему, я думаю, что вы можете достичь того, что вы хотите, используя понимание (DIX) (Версия 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.

Редактировать:

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

>>> 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]}}
...