如何从两个pkl文件创建Python嵌套字典/合并两个嵌套字典为一个?

4 投票
1 回答
999 浏览
提问于 2025-04-17 10:13

我正在尝试把两个嵌套的Python字典合并在一起。每个字典的顶层都有10个键,然后每个键下面又有两个键:'datetimes'和'values'。在最里面的字典中,每个键大约有100,000个项目。

这两个字典的来源是两个pkl文件。我正在用load函数把它们解压成两个字典。有没有办法把这两个pkl文件合成一个字典?如果没有,我该如何把这两个字典合并成一个呢?

我试过这个方法,但它会把一个字典的内容覆盖到另一个字典上,我也没能让这个方法奏效,因为我有的是字典,而不是像例子中那样的带索引的列表。使用.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

如果我理解你的问题没错的话,我觉得你可以用字典推导式来实现你想要的效果(适用于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]}}

如果这不是你想要的结果,请给出初始字典的结构和你希望最终字典的结构的例子。

补充:

根据你在评论中提供的信息,下面的内容应该能帮到你:

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

撰写回答