2012-01-14 120 views
3

我想将两个嵌套的Python词典结合在一起。他们每个人在顶层有10个键,然后每个键有两个键:'datetimes'和'values'。在低级别,嵌套词典的每个键有大约100 000个项目。如何从2个pkl文件创建Python嵌套字典/将2个嵌套字典合并为一个?

2个字典的来源是来自2个pkl文件。我正在使用加载函数将它们解压到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]) 

回答

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

如果这不是你要找的,请给你正在寻找在字典的最终结构是什么初始字典结构的例子的结果。

编辑:

根据您在您的评论提供的信息,以下应该有所帮助:在这个例子中你给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]}} 
>>> 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,拥有相同的顶级键。两者之间的差异实际上是一年的数据,另一年的数据来自另一年的数据。所以如果我修改你的例子是这样的:'dict1 = {'topkey1':{'datetimes':[9,8],'values':[7,6]},'topkey2':{'datetimes':[5 ,'values':[3,2]}}' 'dict2 = {'topkey1':{'datetimes':[29,28],'values':[17,16]},'topkey2' :{'datetimes':[35,34],'values':[43,42]}}' – Aina 2012-01-14 20:25:51

+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 2012-01-14 20:32:14