我正在尝试将两个嵌套的Python字典组合在一起。它们每个都在顶层有10个键,然后10个键中的每个键都有2个键:'datetimes'和'values'。在低级别,嵌套字典的每个键都有大约10万个项目。
2个词典的来源是2个pkl文件。我正在使用加载函数将这些字符串拆成2个字典。有没有办法从这2个pkl文件中获得1个字典?如果没有,我如何将2个词典合并为一个?
我已经尝试了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])
答案 0 :(得分: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]}}
如果这不是您正在寻找的结果,请举例说明最初的字典结构以及您在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]}}