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

Posted

技术标签:

【中文标题】如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?【英文标题】:How to create a Python nested dictionary from 2 pkl files/combine 2 nested dictionaries into one? 【发布时间】:2012-02-10 03:38:14 【问题描述】:

我正在尝试将两个嵌套的 Python 字典组合在一起。他们每个人在顶层都有 10 个键,然后 10 个键中的每一个都有另外 2 个键:'datetimes' 和 'values'。在底层,嵌套字典的每个键大约有 100 000 个项。

2 个字典的来源来自 2 个 pkl 文件。我正在使用加载功能将它们解压到 2 个字典中。有没有办法从这 2 个 pkl 文件中获得 1 个字典?如果没有,如何将这两个字典合二为一?

我尝试过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])

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,我认为您可以使用 dict 理解(版本 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]

【讨论】:

sgallen,在示例中,您给 topkey1 和 topkey3 提供了相同的名称,因此两个字典具有相同的顶部键。两者之间的区别实际上是一个有一年的数据,另一个有另一年的数据。因此,如果我像这样修改您的示例: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] 那么输出将是:'topkey1': 'datetimes': [9,8,29,28], 'values': [7,6,17,16], 'topkey2': 'datetimes': [5,4,35,34], 'values': [3,2,43,42] 我认为 dict 理解是要走的路,但我 5 周的 Python 经验并不能完全让我到达那里。我认为如果我以某种方式修改理解以反映我所追求的输出,你的解决方案应该可以工作。谢谢,艾娜。

以上是关于如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何解压pkl文件?

如何利用python读取PKL文件

python 保存训练好的预测模型 python如何加载训练好的模型pkl格式文件

如何将 for 循环中的 .pkl 文件附加到 for 循环中创建的 pandas 数据帧?

打开pkl文件提示解码错误解决方法

如何使用 .pkl 文件预测图像