如何从2个pkl文件创建一个python嵌套字典/将2个嵌套字典合并为一个?

How to create a Python nested dictionary from 2 pkl files/combine 2 nested dictionaries into one?

我正在尝试将两个嵌套的Python字典组合在一起。它们中的每一个在顶层有10个键,然后每10个键又有2个键:"日期时间"和"值"。在底层,嵌套字典的每个键都有大约100000个项。

2个字典的来源是2个pkl文件。我正在使用加载函数将它们解压成两个词典。有没有办法从这两个pkl文件中得到一个字典?如果没有,我怎么能把这两本词典合并成一本呢?

我已经尝试过这个解决方案,但是它会覆盖一个字典而不是另一个,而且我不能让这个解决方案工作,因为我有字典而不是示例中索引列表。按照这里的建议,使用.copy()也会覆盖一个字典。如果我能把一本字典附加到另一本字典上,那就太好了,但这篇文章似乎表明字典并不是这样工作的。

所以我想也许我可以用这些字典创建数组,然后重新整形和连接它们。但速度太慢了。以下是迄今为止我所拥有的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)

所以我尝试运行这些命令:

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

如果我正确理解您的问题,我认为您可以使用听写理解(3.x和2.7版)来完成您想要的工作:

1
2
3
4
5
6
>>> 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的最终结构中要查找的内容。

编辑:

根据您在评论中提供的信息,以下内容应有所帮助:

1
2
3
4
5
6
7
8
>>> 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]}}